Pandas可变数列到二进制矩阵

时间:2015-07-18 17:50:22

标签: python csv matrix pandas

我目前正在使用的数据集(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有相当的了解,但对熊猫却没有。因此,我很乐意请某人给我一些帮助,因为我似乎找不到这样做的方法。谢谢!

1 个答案:

答案 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()
# =========================