Pandas DataFrame - 将系列字符串拆分为多列

Der*_*ull 2 python split dataframe pandas

我的问题更多的是关于前一篇文章中描述的方法/语法,它解决了实现将字符串值拆分为列表并将每个列表项分配给新列的相同目标的不同方法.这是帖子: Pandas DataFrame,我如何将一个列分成两个

DF:

                          GDP
Date                        
Mar 31, 2017  19.03 trillion
Dec 31, 2016  18.87 trillion
Run Code Online (Sandbox Code Playgroud)

脚本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
Run Code Online (Sandbox Code Playgroud)

脚本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
Run Code Online (Sandbox Code Playgroud)

脚本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
Run Code Online (Sandbox Code Playgroud)

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

piR*_*red 5

让我们从这个开始吧

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

0    [19.03, trillion]
1    [18.87, trillion]
Name: GDP, dtype: object
Run Code Online (Sandbox Code Playgroud)

它会生成一系列列表.但是,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
Run Code Online (Sandbox Code Playgroud)

要么

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

Date
Mar 31, 2017    trillion
Dec 31, 2016    trillion
Name: GDP, dtype: object
Run Code Online (Sandbox Code Playgroud)

因此,如果我们分成两个元素列表,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
Run Code Online (Sandbox Code Playgroud)

b

Date
Mar 31, 2017    trillion
Dec 31, 2016    trillion
Name: GDP, dtype: object
Run Code Online (Sandbox Code Playgroud)

好的,我们可以通过利用这个可迭代的解包来缩短两个新列的创建

df['GDP'], df['Units'] = df['GDP'].str.split(' ', 1).str
Run Code Online (Sandbox Code Playgroud)

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

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

                  0         1
Date                         
Mar 31, 2017  19.03  trillion
Dec 31, 2016  18.87  trillion
Run Code Online (Sandbox Code Playgroud)

现在我们可以将数据帧分配给另一个数据帧的新列

df[['GDP', 'Units']] = df['GDP'].str.split(' ', 1, expand=True)
Run Code Online (Sandbox Code Playgroud)

但是,当我们做的时候

df['GDP'], df['Units'] = df['GDP'].str.split(' ', 1, expand=True)
Run Code Online (Sandbox Code Playgroud)

df['GDP'].str.split(' ', 1, expand=True)获取解压缩的返回值,这些结果只是列值.如果你看到上面,你会发现它们是01.因此,在这种情况下,0将分配给列df['GDP']1分配给列df['Units']