Pandas 熊猫:与get_假人的共现矩阵

Pandas 熊猫:与get_假人的共现矩阵,pandas,Pandas,我试图重塑一个数据帧,以创建一种发生矩阵,但没有成功 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_e

我试图重塑一个数据帧,以创建一种发生矩阵,但没有成功

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

您可以对
xlst_条目进行一些预处理
,将所有条目合并为一个由
|
分隔的字符串,然后使用:

结果输出:

   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

您可以调整其中的参数,以便删除所形成列的
前缀
,并对具有相同名称的列求和,以获得所需的帧

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

这是一个有点通用的辅助函数,几乎可以用于任何data.frame(用python2编写,对于python3测试,请确保用
列表
包装
映射
减少
函数):

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
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]