我目前正在使用的数据集(csv文件)没有固定数量的列。但是,我想将它转换为具有固定列数的二进制矩阵。
例如,当前数据集是这样的(没有标题),
a,b,x,z,y
b,e,w,t,u,o,s,z,i
z,o,w
o,p,w,z,a
我希望将其转换为下面的内容(第一行是标题)
a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z
1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1
0,1,0,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,1,1,1,0,1,0,0,1
0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,1
1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,1
我遇到的主要问题是数据集中的列数不等。我正在考虑的伪代码或逻辑就是这个
header=[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z]
data_frame=csv file
df=new data frame
for each row in data_frame:
for each item in row:
create pandas Series
if item in header:
append '1' to Series
else:
append '0' to Series
append series to df
最后,矩阵应写入另一个csv文件。
我对python有相当的了解,但对熊猫却没有。因此,我很乐意请某人给我一些帮助,因为我似乎找不到这样做的方法。谢谢!
答案 0 :(得分:1)
以下是使用pd.get_dummies()
进行此操作的一种方法。
import pandas as pd
# read your csv data, separate must not be ',', for example, set tab `\t`
# =======================================================================
# I just read from clipboard
df = pd.read_clipboard(header=None, sep='\t')
df
0
0 a,b,x,z,y
1 b,e,w,t,u,o,s,z,i
2 z,o,w
3 o,p,w,z,a
# step 1
# =========================
df1 = df.groupby(level=0).apply(lambda group: pd.Series(group.values.ravel().tolist()[0].split(',')))
df1
0 0 a
1 b
2 x
3 z
4 y
1 0 b
1 e
2 w
3 t
4 u
..
7 z
8 i
2 0 z
1 o
2 w
3 0 o
1 p
2 w
3 z
4 a
dtype: object
# step 2
# =========================
pd.get_dummies(df1).groupby(level=0).agg(max)
a b e ... x y z
0 1 1 0 ... 1 1 1
1 0 1 1 ... 0 0 1
2 0 0 0 ... 0 0 1
3 1 0 0 ... 0 0 1
[4 rows x 13 columns]
# step 3, to_csv()
# =========================