我有7个csv文件,其中包含单词列表。我从7 csv中取出了所有的单词并输入了一个名为Total_Words_list的新文件。
问题是我需要以下矩阵中的输出:
APPLE BALL CAT DOG....
A 0 1 1 0
B 1 1 0 1
C 1 1 1 0
此处主列表中的单词构成行,7个文件名构成列。如果文件A中存在一个单词,则它将变为1,否则为0,依此类推。这在一次运行中对所有7个csv文件都有效,我得到了上述结果。
我不确定如何处理这个问题。
答案 0 :(得分:4)
您可以使用concat
将所有DataFrames
和stack
与str.get_dummies
联系起来。索引(level=0
)最后需要groupby
,汇总sum
:
import pandas as pd
import numpy as np
import io
temp=u"""CAT;BALL
"""
#after testing replace io.StringIO(temp) to filename
df1 = pd.read_csv(io.StringIO(temp), sep=";", index_col=None, header=None)
print (df1)
temp=u"""DOG;BALL;APPLE
"""
#after testing replace io.StringIO(temp) to filename
df2 = pd.read_csv(io.StringIO(temp), sep=";", index_col=None, header=None)
print (df2)
temp=u"""DOG;BALL;APPLE;CAT
"""
#after testing replace io.StringIO(temp) to filename
df3 = pd.read_csv(io.StringIO(temp), sep=";", index_col=None, header=None)
print (df3)
df = pd.concat([df1,df2,df3], keys=['A','B','C'])
df.reset_index(1, drop=True, inplace=True)
print (df)
0 1 2 3
A CAT BALL NaN NaN
B DOG BALL APPLE NaN
C DOG BALL APPLE CAT
print (df.stack().reset_index(1, drop=True).str.get_dummies())
APPLE BALL CAT DOG
A 0 0 1 0
A 0 1 0 0
B 0 0 0 1
B 0 1 0 0
B 1 0 0 0
C 0 0 0 1
C 0 1 0 0
C 1 0 0 0
C 0 0 1 0
print (df.stack().reset_index(1, drop=True).str.get_dummies().groupby(level=0).sum())
APPLE BALL CAT DOG
A 0 1 1 0
B 1 1 0 1
C 1 1 1 1
另一个解决方案pandas.get_dummies
和groupby
按列(level=0
,轴= 1),汇总sum
:
print (pd.get_dummies(df, dummy_na=False, prefix='', prefix_sep='')
.groupby(level=0, axis=1).sum())
APPLE BALL CAT DOG
A 0 1 1 0
B 1 1 0 1
C 1 1 1 1
通过评论编辑:
另一种方法是分别从每个数据框获取dummies
,然后输出concat
:
df11 = pd.get_dummies(df1, dummy_na=False, prefix='', prefix_sep='')
.groupby(level=0, axis=1).sum()
#print (df11)
df21 = pd.get_dummies(df2, dummy_na=False, prefix='', prefix_sep='')
.groupby(level=0, axis=1).sum()
#print (df21)
df31 = pd.get_dummies(df3, dummy_na=False, prefix='', prefix_sep='')
.groupby(level=0, axis=1).sum()
#print (df31)
df = pd.concat([df11,df21,df31], keys=['A','B','C']).fillna(0).astype(int)
df.reset_index(1, drop=True, inplace=True)
print (df)
APPLE BALL CAT DOG
A 0 1 1 0
B 1 1 0 1
C 1 1 1 1