我有一个数据框,例如:
import pandas as pd
my_df = pd.DataFrame({'col1':['A', 'B', 'C', 'A', 'A', 'B'],
'col2':['foo bar', 'bar', 'something foo', 'foo', 'bar', 'foo']})
我想为其中一列中出现的每个单词生成列,例如col2,并计算该行中出现的次数。
col1 col2 foo bar something
0 A foo bar 1 1 0
1 B bar 0 1 0
2 C something foo 1 0 1
3 A foo 1 0 0
4 A bar 0 1 0
5 B foo 1 0 0
我的数据框比这个例子要大得多。每列可以有多个单词。
答案 0 :(得分:5)
您需要join
+ get_dummies
:
df = my_df.join(pd.get_dummies(my_df['col2']))
print (df)
col1 col2 bar foo something
0 A foo 0 1 0
1 B bar 1 0 0
2 C something 0 0 1
3 A foo 0 1 0
4 A bar 1 0 0
5 B foo 0 1 0
编辑 - 是必要的str.get_dummies
:
df = my_df.join(my_df['col2'].str.get_dummies(' '))
print (df)
col1 col2 bar foo something
0 A foo bar 1 1 0
1 B bar 1 0 0
2 C something foo 0 1 1
3 A foo 0 1 0
4 A bar 1 0 0
5 B foo 0 1 0
但如果一行中有多个相同的单词并需要计算它们:
my_df = pd.DataFrame({'col1':['A', 'B', 'C', 'A', 'A', 'B'],
'col2':['foo bar foo', 'bar', 'something foo', 'foo', 'bar', 'foo']})
print (my_df)
col1 col2
0 A foo bar foo
1 B bar
2 C something foo
3 A foo
4 A bar
5 B foo
df = my_df.join(my_df['col2'].str.split(expand=True)
.apply(pd.value_counts,1)
.fillna(0)
.astype(int))
print (df)
col1 col2 bar foo something
0 A foo bar foo 1 2 0
1 B bar 1 0 0
2 C something foo 0 1 1
3 A foo 0 1 0
4 A bar 1 0 0
5 B foo 0 1 0
答案 1 :(得分:3)
让我们使用pd.concat
和pd.concat([my_df,my_df.col2.str.get_dummies(' ')],axis=1)
:
col1 col2 bar foo something
0 A foo bar 1 1 0
1 B bar 1 0 0
2 C something foo 0 1 1
3 A foo 0 1 0
4 A bar 1 0 0
5 B foo 0 1 0
输出:
{{1}}
答案 2 :(得分:2)
这是一个大数据集的内存保存解决方案,它使用稀疏矩阵和SparseDataFrame:
In [33]: from sklearn.feature_extraction.text import CountVectorizer
In [34]: vect = CountVectorizer()
In [35]: X = vect.fit_transform(my_df['col2'])
In [36]: r = pd.SparseDataFrame(X, columns=vect.get_feature_names(),
index=my_df.index, default_fill_value=0)
In [37]: r['col1'] = my_df.col1
In [38]: r
Out[38]:
bar foo something col1
0 1 1 0 A
1 1 0 0 B
2 0 1 1 C
3 0 1 0 A
4 1 0 0 A
5 0 1 0 B
注意内存使用情况:
In [39]: r.memory_usage()
Out[39]:
Index 80
bar 24 # 3 * 8 byte (np.int64)
foo 32 # 4 * 8 byte (np.int64)
something 8 # 1 * 8 byte (np.int64)
col1 48
dtype: int64
注意:这仅适用于Pandas版本0.20.1+。对于早期版本,我们可以使用以下技巧:
for i, col in enumerate(vect.get_feature_names()):
my_df[col] = pd.SparseSeries(X[:, i].A.ravel(), fill_value=0)
而不是:
r = pd.SparseDataFrame(X, columns=vect.get_feature_names(),
index=my_df.index, default_fill_value=0)