2016-08-31 100 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]