【问题标题】:Pandas DataFrame - Splitting Series Strings into Multiple ColumnsPandas DataFrame - 将系列字符串拆分为多列
【发布时间】:2017-07-01 23:27:20
【问题描述】:

我的问题更多是关于上一篇文章中描述的方法/语法,该文章解决了将字符串值拆分为列表并将每个列表项分配给新列的相同目标的不同方法。这是帖子:Pandas DataFrame, how do i split a column into two

df:

                          GDP
Date                        
Mar 31, 2017  19.03 trillion
Dec 31, 2016  18.87 trillion

脚本 1 + 输出:

>>> df['GDP'], df['Units'] = df['GDP'].str.split(' ', 1).str
>>> print(df)

                GDP     Units
Date                         
Mar 31, 2017  19.03  trillion
Dec 31, 2016  18.87  trillion

脚本 2 + 输出:

>>> df[['GDP', 'Units']] = df['GDP'].str.split(' ', 1, expand=True)
>>> print(df)

                GDP     Units
Date                         
Mar 31, 2017  19.03  trillion
Dec 31, 2016  18.87  trillion

脚本 3 + 输出:

>>> df['GDP'], df['Units'] = df['GDP'].str.split(' ', 1, expand=True)
>>> print(df)

              GDP  Units
Date                    
Mar 31, 2017    0      1
Dec 31, 2016    0      1

谁能解释发生了什么?为什么脚本 3 会在输出中生成这些值?

【问题讨论】:

    标签: python pandas dataframe split


    【解决方案1】:

    让我们先看看这个

    df['GDP'].str.split(' ', 1)
    
    0    [19.03, trillion]
    1    [18.87, trillion]
    Name: GDP, dtype: object
    

    它产生一系列列表。然而,pd.Series.str,又名字符串访问器,允许我们通过直观的 python 列表索引访问这些嵌入式列表的第一、第二、……部分。

    df['GDP'].str.split(' ', 1).str[0]
    
    Date
    Mar 31, 2017    19.03
    Dec 31, 2016    18.87
    Name: GDP, dtype: object
    

    或者

    df['GDP'].str.split(' ', 1).str[1]
    
    Date
    Mar 31, 2017    trillion
    Dec 31, 2016    trillion
    Name: GDP, dtype: object
    

    因此,如果我们拆分为两个元素列表 split(' ', 1),我们可以将来自另一个 str 的返回对象视为一个可迭代对象

    a, b = df['GDP'].str.split(' ', 1).str
    
    a
    
    Date
    Mar 31, 2017    19.03
    Dec 31, 2016    18.87
    Name: GDP, dtype: object
    

    还有

    b
    
    Date
    Mar 31, 2017    trillion
    Dec 31, 2016    trillion
    Name: GDP, dtype: object
    

    好的,我们可以通过利用这种可迭代的解包来快捷地创建两个新列

    df['GDP'], df['Units'] = df['GDP'].str.split(' ', 1).str
    

    但是,我们可以将参数传递给 expand 我们的新列表到新的数据框列中

    df['GDP'].str.split(' ', 1, expand=True)
    
                      0         1
    Date                         
    Mar 31, 2017  19.03  trillion
    Dec 31, 2016  18.87  trillion
    

    现在我们可以像这样将一个数据框分配给另一个数据框的新列

    df[['GDP', 'Units']] = df['GDP'].str.split(' ', 1, expand=True)
    

    但是,当我们这样做时

    df['GDP'], df['Units'] = df['GDP'].str.split(' ', 1, expand=True)
    

    df['GDP'].str.split(' ', 1, expand=True) 的返回值被解包,这些结果只是列值。如果您在上面看到,您会注意到它们是01。所以在这种情况下,0 被分配给df['GDP'] 列,1 被分配给df['Units']

    【讨论】:

      猜你喜欢
      • 2022-12-29
      • 2020-11-10
      • 2017-01-07
      • 1970-01-01
      • 1970-01-01
      • 2016-09-10
      • 2016-11-17
      相关资源
      最近更新 更多