2016-08-31 63 views
2

我想重塑一个数据框来创建一种出现矩阵,但没有成功。熊猫:与get_dummies共生矩阵

pandas.get_dummies()正确的方法来做到这一点?

这里是我试过到目前为止

import pandas as pd 

xlst_entries = [[u'aus', u'fra', u'gbr'],[u'gbr', u'prt'],[u'chn'],[u'bel', u'gbr'],[u'gbr', u'prt'],[u'gbr', u'prt'],[u'gbr', u'prt']] 

qq1 = pd.DataFrame(xlst_entries) 

qq2 = pd.get_dummies(data= qq1, prefix=None) 
qq2 

但结果我要的是

index fra bel  chn  prt  aus  gbr 

0 1 0 0 0 1 1 
1 0 0 0 1 0 1 
2 0 0 1 0 0 0 
3 0 1 0 0 0 1 
4 0 0 0 1 0 1 
5 0 0 0 1 0 1 
6 0 0 0 1 0 1 

回答

1

你可以调整的参数内get_dummies使得所形成的列的prefix被移除,并用相同的名称总结列以获得所需的帧。

df = pd.get_dummies(df, prefix='', prefix_sep='') 

df.groupby(df.columns, axis=1).agg(np.sum).astype(int) 

    aus bel chn fra gbr prt 
0 1 0 0 1 1 0 
1 0 0 0 0 1 1 
2 0 0 1 0 0 0 
3 0 1 0 0 1 0 
4 0 0 0 0 1 1 
5 0 0 0 0 1 1 
6 0 0 0 0 1 1 
1

你可以做的xlst_entries一些预处理的所有条目相结合,通过|分离单个字符串,然后使用Series.str.get_dummies

xlst_entries = ['|'.join(x) for x in xlst_entries] 
qq1 = pd.Series(xlst_entries).str.get_dummies() 

所得到的输出:

aus bel chn fra gbr prt 
0 1 0 0 1 1 0 
1 0 0 0 0 1 1 
2 0 0 1 0 0 0 
3 0 1 0 0 1 0 
4 0 0 0 0 1 1 
5 0 0 0 0 1 1 
6 0 0 0 0 1 1 
1

这是一个很普通的辅助功能,它应该工作在几乎任何data.frame(写在python2,为python3测试,请务必与list包裹mapreduce功能):

def get_multiple_dummies(dframe): 
    from functools import reduce 
    combined = [pd.get_dummies(dframe.iloc[:, i]) for i in range(len(dframe.columns))] 
    allcolumns = set(reduce(list.__add__, map(lambda y: y.columns.tolist(), 
     combined))) 
    combined = map(lambda x: pd.concat([x, pd.DataFrame(
     columns = filter(lambda y: y not in x.columns, 
     allcolumns))]), combined) 
    return reduce(lambda x,y: x.fillna(0)+y.fillna(0), combined) 

print get_multiple_dummies(qq1) 

    aus bel chn fra gbr prt 
0 1 0 0 1 1 0 
1 0 0 0 0 1 1 
2 0 0 1 0 0 0 
3 0 1 0 0 1 0 
4 0 0 0 0 1 1 
5 0 0 0 0 1 1 
6 0 0 0 0 1 1 

[7 rows x 6 columns]