从itemset到dataframe

时间:2016-07-27 06:08:04

标签: python numpy pandas

从项目集列表中可以扩展的方式是什么::

itemset = [['a', 'b'],
           ['b', 'c', 'd'],
           ['a', 'c', 'd', 'e'],
           ['d'],
           ['a', 'b', 'c'],
           ['a', 'b', 'c', 'd']]

到这种数据框::

>>> df
   a  b  c  d  e
0  1  1  0  0  0
1  0  1  1  1  0
2  1  0  1  1  1
3  0  0  0  1  0
4  1  1  1  0  0
5  1  1  1  1  0
>>>

df的目标大小为1e6行和500列。

2 个答案:

答案 0 :(得分:2)

您可以使用get_dummies

print (pd.DataFrame(itemset))
   0     1     2     3
0  a     b  None  None
1  b     c     d  None
2  a     c     d     e
3  d  None  None  None
4  a     b     c  None
5  a     b     c     d
df1 = (pd.get_dummies(pd.DataFrame(itemset), prefix='', prefix_sep='' ))
print (df1)
     a    b    d    b    c    c    d    d    e
0  1.0  0.0  0.0  1.0  0.0  0.0  0.0  0.0  0.0
1  0.0  1.0  0.0  0.0  1.0  0.0  1.0  0.0  0.0
2  1.0  0.0  0.0  0.0  1.0  0.0  1.0  0.0  1.0
3  0.0  0.0  1.0  0.0  0.0  0.0  0.0  0.0  0.0
4  1.0  0.0  0.0  1.0  0.0  1.0  0.0  0.0  0.0
5  1.0  0.0  0.0  1.0  0.0  1.0  0.0  1.0  0.0

print (df1.groupby(df1.columns, axis=1).sum().astype(int))
   a  b  c  d  e
0  1  1  0  0  0
1  0  1  1  1  0
2  1  0  1  1  1
3  0  0  0  1  0
4  1  1  1  0  0
5  1  1  1  1  0

答案 1 :(得分:0)

这是一种几乎矢量化的方法 -

items = np.concatenate(itemset)           
col_idx = np.fromstring(items, dtype=np.uint8)-97

lens = np.array([len(item) for item in itemset])
row_idx = np.repeat(np.arange(lens.size),lens)
out = np.zeros((lens.size,lens.max()+1),dtype=int)
out[row_idx,col_idx] = 1   

df = pd.DataFrame(out,columns=np.unique(items))

最后一行可以被这样的东西取代,并且可以更高效 -

df = pd.DataFrame(out,columns=items[np.unique(col_idx,return_index=True)[1]])