Python:从数据帧创建邻接矩阵

Python:从数据帧创建邻接矩阵,python,pandas,dataframe,adjacency-matrix,Python,Pandas,Dataframe,Adjacency Matrix,我有以下数据框: Company Firm 125911 1 125911 2 32679 3 32679 5 32679 5 32679 8 32679 10 32679 12 43805 14 67734 8 67734 9 67734 10 67734 10 67734 11 67734 12 67734 13 74240 4 74240 6 74240 7 基本上,公司在特定年份对公司进行投资,在这种情况下,所有公

我有以下数据框:

Company Firm
125911  1
125911  2
32679   3
32679   5
32679   5
32679   8
32679   10
32679   12
43805   14
67734   8
67734   9
67734   10
67734   10
67734   11
67734   12
67734   13
74240   4
74240   6
74240   7
基本上,公司在特定年份对公司进行投资,在这种情况下,所有公司的投资年份都相同。我想在python中做的是创建一个只有0和1的简单邻接矩阵。1如果两家公司对同一家公司进行了投资。因此,即使企业10和8在同一时间投资于两个不同的企业,它仍然是1。 我要查找的结果矩阵如下所示:

Firm 1  2   3   4   5   6   7   8   9   10  11  12  13  14
1   0   1   0   0   0   0   0   0   0   0   0   0   0   0
2   1   0   0   0   0   0   0   0   0   0   0   0   0   0
3   0   0   0   0   1   0   0   1   0   1   0   1   0   0
4   0   0   0   0   0   1   1   0   0   0   0   0   0   0
5   0   0   1   0   0   0   0   1   0   1   0   1   0   0
6   0   0   0   1   0   0   1   0   0   0   0   0   0   0
7   0   0   0   1   0   1   0   0   0   0   0   0   0   0
8   0   0   1   0   1   0   0   0   1   1   1   1   1   0
9   0   0   0   0   0   0   0   1   0   1   1   1   1   0
10  0   0   1   0   1   0   0   1   1   0   1   1   1   0
11  0   0   0   0   0   0   0   1   1   1   0   1   1   0
12  0   0   1   0   1   0   0   1   1   1   1   0   1   0
13  0   0   0   0   0   0   0   1   1   1   1   1   0   0
14  0   0   0   0   0   0   0   0   0   0   0   0   0   0
我看到过类似的问题,您可以使用
交叉表
,但是在这种情况下,每个公司只有一行,所有公司都在不同的列中。因此,我想知道解决这个具体问题的最佳和最有效的方法是什么?非常感谢您的帮助

dfm = df.merge(df, on="Company").query("Firm_x != Firm_y")
out = pd.crosstab(dfm['Firm_x'], dfm['Firm_y'])
印刷品:

1234567891011214
1    0   1   0   0   0   0   0   0   0   0   0   0   0   0
2    1   0   0   0   0   0   0   0   0   0   0   0   0   0
3    0   0   0   0   1   0   0   1   0   1   0   1   0   0
4    0   0   0   0   0   1   1   0   0   0   0   0   0   0
5    0   0   1   0   0   0   0   1   0   1   0   1   0   0
6    0   0   0   1   0   0   1   0   0   0   0   0   0   0
7    0   0   0   1   0   1   0   0   0   0   0   0   0   0
8    0   0   1   0   1   0   0   0   1   1   1   1   1   0
9    0   0   0   0   0   0   0   1   0   1   1   1   1   0
10   0   0   1   0   1   0   0   1   1   0   1   1   1   0
11   0   0   0   0   0   0   0   1   1   1   0   1   1   0
12   0   0   1   0   1   0   0   1   1   1   1   0   1   0
13   0   0   0   0   0   0   0   1   1   1   1   1   0   0
14   0   0   0   0   0   0   0   0   0   0   0   0   0   0

干杯!非常感谢你
>>> out
Firm_y  1   2   3   4   5   6   7   8   9   10  11  12  13  14
Firm_x
1        1   0   0   0   0   0   0   0   0   0   0   0   0   0
2        0   1   0   0   0   0   0   0   0   0   0   0   0   0
3        0   0   1   0   0   0   0   0   0   0   0   0   0   0
4        0   0   0   1   0   0   0   0   0   0   0   0   0   0
5        0   0   0   0   4   0   0   0   0   0   0   0   0   0
6        0   0   0   0   0   1   0   0   0   0   0   0   0   0
7        0   0   0   0   0   0   1   0   0   0   0   0   0   0
8        0   0   0   0   0   0   0   2   0   0   0   0   0   0
9        0   0   0   0   0   0   0   0   1   0   0   0   0   0
10       0   0   0   0   0   0   0   0   0   5   0   0   0   0
11       0   0   0   0   0   0   0   0   0   0   1   0   0   0
12       0   0   0   0   0   0   0   0   0   0   0   2   0   0
13       0   0   0   0   0   0   0   0   0   0   0   0   1   0
14       0   0   0   0   0   0   0   0   0   0   0   0   0   1
dfs = []
for s in df.groupby("Company").agg(list).values:
    dfs.append(pd.DataFrame(index=set(s[0]), columns=set(s[0])).fillna(1))

out = pd.concat(dfs).groupby(level=0).sum().gt(0).astype(int)
np.fill_diagonal(out.values, 0)
print(out)