我有一个愚蠢的数据,其中一列包含多个用逗号分隔的值:
In [62]: df = pd.DataFrame({'U': ['foo', 'bar', 'baz'], 'V': ['a,b,a,c,d', 'a,b,c', 'd,e']})
In [63]: df
Out[63]:
U V
0 foo a,b,a,c,d
1 bar a,b,c
2 baz d,e
现在,我想拆分列V
,将其删除,并添加列a
至e
。 a
至e
列应包含该行中该字母的出现次数:
In [62]: df = pd.DataFrame({'U': ['foo', 'bar', 'baz'], 'V': ['a,b,a,c,d', 'a,b,c', 'd,e']})
In [63]: df
Out[63]:
U a b c d e
0 foo 2 1 1 1 0
1 bar 1 1 1 0 0
2 baz 0 0 0 1 1
也许是df['V'].str.split(',')
和pandas.get_dummies
的某种组合,但我还不能完全解决。
编辑:显然我必须证明为什么我的问题不是重复的。我认为对于大多数随便的观察者来说,为什么在直观上是显而易见的。
答案 0 :(得分:3)
这是str.get_dummies
pd.concat([df,df.pop('V').str.split(',',expand=True).stack().str.get_dummies().sum(level=0)],1)
Out[602]:
U a b c d e
0 foo 2 1 1 1 0
1 bar 1 1 1 0 0
2 baz 0 0 0 1 1
答案 1 :(得分:1)
您可以只使用pandas.Series.str.count
。例如:
import pandas as pd
df = pd.DataFrame({'U': ['foo', 'bar', 'baz'], 'V': ['a,b,a,c,d', 'a,b,c', 'd,e']})
columns = ['a', 'b', 'c', 'd', 'e']
# If unknown or large set of columns, then replace above with:
# columns = sorted(set(df['V'].str.split(',').sum()))
for column in columns:
df[column] = df['V'].str.count(column)
print(df)
# U V a b c d e
# 0 foo a,b,a,c,d 2 1 1 1 0
# 1 bar a,b,c 1 1 1 0 0
# 2 baz d,e 0 0 0 1 1