2017-07-01 119 views
1

我的问题更多地是关于前一篇文章中描述的方法/语法,它解决了不同的方法来满足将字符串值拆分为列表和将每个列表项分配给新列的相同目标。这里的帖子:Pandas DataFrame, how do i split a column into two熊猫DataFrame - 将系列字符串分成多列

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在输出中产生这些值?通过查看此

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

0 [19.03, trillion] 
1 [18.87, trillion] 
Name: GDP, dtype: object 

回答

1

让我们首先它会产生一系列列表。然而,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']