我有一些组织(以列,“ fakulta”表示),它们在众多项目(行,“ ID_RIV”)上进行了(或不进行)合作。
输入DF:
df = pd.DataFrame({'FEI':[1,0,0,1,0],
'HGF':[0,1,1,0,0],
'FBI':[0,1,1,1,1]},
index = [1,2,3,4,5])
df.index.name = 'ID_RIV'
df.columns.name = 'fakulta'
print(df)
fakulta FEI HGF FBI
ID_RIV
1 1 0 0
2 0 1 1
3 0 1 1
4 1 0 1
5 0 0 1
我想知道谁与谁合作。
如何将输入DF转换为对称矩阵(方形DF),如下所示:
所需的输出:
FEI HGF FBI
FEI 1 0 1
HGF 0 0 2
FBI 1 2 1
答案 0 :(得分:1)
您可以使用点积,然后再替换对角线。这将完全返回您需要的输出。
import numpy as np
df_out = df.T.dot(df)
df_singles = df.loc[df.sum(axis=1)==1]
df_singles = df_singles.T.dot(df_singles)
df_out.values[[np.arange(df_out.shape[0])]*2] = df_singles.values[[np.arange(df_singles.shape[1])]*2]
In [273]: df_out
Out[273]:
FEI HGF FBI
FEI 1 0 1
HGF 0 0 2
FBI 1 2 1