我的问题更多的是关于前一篇文章中描述的方法/语法,它解决了实现将字符串值拆分为列表并将每个列表项分配给新列的相同目标的不同方法。这是帖子:Pandas DataFrame, how do i split a column into two
DF:
CharSequence
脚本1 +输出:
Integer
脚本2 +输出:
GDP
Date
Mar 31, 2017 19.03 trillion
Dec 31, 2016 18.87 trillion
脚本3 +输出:
>>> 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
有谁可以解释发生了什么?为什么脚本3在输出中产生这些值?
答案 0 :(得分:5)
让我们先来看看这个
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)
的返回值被解压缩,这些结果只是列值。如果您在上面看到,则会发现它们是0
和1
。因此,在这种情况下,0
已分配给列df['GDP']
,1
已分配给列df['Units']