【问题标题】:Python: Creating an adjacency matrix from a dataframePython:从数据框创建邻接矩阵
【发布时间】:2021-05-04 17:10:05
【问题描述】:

我有以下数据框:

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,但是在这种情况下,每家公司将只有一行,所有公司都位于不同的列中。所以我想知道解决这个特定问题的最佳和最有效的方法是什么?非常感谢任何帮助。

【问题讨论】:

    标签: python pandas dataframe adjacency-matrix


    【解决方案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)
    

    打印:

        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
    

    【讨论】:

    • 干杯!非常感谢
    【解决方案2】:
    dfm = df.merge(df, on="Company").query("Firm_x != Firm_y")
    out = pd.crosstab(dfm['Firm_x'], dfm['Firm_y'])
    
    >>> 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-29
      • 1970-01-01
      • 1970-01-01
      • 2018-06-21
      • 1970-01-01
      相关资源
      最近更新 更多