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

标签 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

基本上,公司在特定年份对公司进行投资,在这种情况下,所有公司都是同一年。我想在 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

我见过类似的问题,您可以在其中使用 crosstab,但是在这种情况下,每家公司将只有一行,而所有公司都在不同的列中。所以我想知道解决这个特定问题的最佳和最有效的方法是什么?非常感谢任何帮助。

最佳答案

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)

打印:

    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

关于Python:从数据框创建邻接矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67389179/

相关文章:

python - Large Pandas Dataframe 中一小部分值的频率

python - 删除 Pandas 中的双引号

python - 使用 python 在 Elasticsearch 中进行身份验证

python - 如何解释 h2o 决策树?

Python a &= b 是什么意思?

python - 类型错误 : unsupported operand type(s) for &: 'sage.rings.rational.Rational' and 'int'

python - 为什么从对象或 str 转换为类别时 dtype 不同?

pandas - pandas 峰度是如何定义的?

r - 使用来自其他列的某些行的值创建新列

apache-spark - 基于其他数据帧中的列 Spark 重复数据帧中的列