pandas 从多列的唯一值创建邻接矩阵

wribegjk  于 2023-02-14  发布在  其他
关注(0)|答案(2)|浏览(144)

我有 Dataframe 形状如下:
| 乡村|制度|部门|个体|
| - ------|- ------|- ------|- ------|
| 美国|苹果|市场营销|约翰·福勒|
| 联合 Realm |苹果|市场营销|彼得潘|
| 中国|苹果|财务|约翰·福勒|
| 阿根廷|博施|市场营销|梅西|
我想创建一个加权邻接矩阵,如下所示:
| | 美国|联合 Realm |中国|阿根廷|苹果|博施|市场营销|财务|约翰·福勒|彼得潘|梅西|
| - ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|
| 美国|无|无|无|无|1个|无|1个|无|1个|无|无|
| 联合 Realm |无|无|无|无|1个|无|1个|无|无|1个|无|
| 中国|无|无|无|无|1个|无|无|1个|1个|无|无|
| 阿根廷|无|无|无|无|无|1个|1个|无|无|无|1个|
| 苹果|1个|1个|1个|无|无|无|第二章|1个|第二章|1个|无|
| 博施|无|无|无|1个|无|无|1个|无|无|无|1个|
| 市场营销|1个|1个|无|1个|第二章|1个|无|无|1个|1个|1个|
| 财务|无|无|1个|无|1个|无|无|无|1个|无|无|
| 约翰·福勒|1个|无|1个|无|第二章|无|1个|1个|无|无|无|
| 彼得潘|无|1个|无|无|1个|无|1个|无|无|无|无|
| 梅西|无|无|无|1个|无|1个|1个|无|无|无|无|
我看过herehere的例子,但是我无法将解扩展到2列以上。

mf98qq94

mf98qq941#

可以将生成器与itertools.permutationspandas.crosstab一起使用:

from itertools import permutations

out = (pd.crosstab(*zip(*((a, b) for l in df.to_numpy().tolist()
                          for a,b in permutations(l, r=2))))
      ).rename_axis(index=None, columns=None)

输出:

Apple  Argentina  Bosch  China  Finance  John Fowler  Marketing  Messi  Peter Pan  UK  USA
Apple            0          0      0      1        1            2          2      0          1   1    1
Argentina        0          0      1      0        0            0          1      1          0   0    0
Bosch            0          1      0      0        0            0          1      1          0   0    0
China            1          0      0      0        1            1          0      0          0   0    0
Finance          1          0      0      1        0            1          0      0          0   0    0
John Fowler      2          0      0      1        1            0          1      0          0   0    1
Marketing        2          1      1      0        0            1          0      1          1   1    1
Messi            0          1      1      0        0            0          1      0          0   0    0
Peter Pan        1          0      0      0        0            0          1      0          0   1    0
UK               1          0      0      0        0            0          1      0          1   0    0
USA              1          0      0      0        0            1          1      0          0   0    0

工作原理:

  • 对于每行,生成2个项目[(a,b), (b,a), ...]的所有组合
  • 整形为2个数组[(a,b,...),(b,a,...)]
  • 将数组传递给crosstab,扩展为前两个参数
对应图表:

niknxzdl

niknxzdl2#

可以使用sliding_window_viewnetworkx来获得加权邻接矩阵:

from numpy.lib.stride_tricks import sliding_window_view
import networkx as nx

edges = sliding_window_view(df1.values, (len(df1), 2)).reshape(-1, 2)
edges = pd.DataFrame(edges, columns=['source', 'target']).value_counts().reset_index()

G = nx.from_pandas_edgelist(edges, edge_attr='count')
adjmx = nx.to_pandas_adjacency(G, weight='count').astype(int)

输出:

>>> adjmx
             Apple  Marketing  Finance  Argentina  Bosch  China  John Fowler  Messi  Peter Pan  UK  USA
Apple            0          2        1          0      0      1            0      0          0   1    1
Marketing        2          0        0          0      1      0            1      1          1   0    0
Finance          1          0        0          0      0      0            1      0          0   0    0
Argentina        0          0        0          0      1      0            0      0          0   0    0
Bosch            0          1        0          1      0      0            0      0          0   0    0
China            1          0        0          0      0      0            0      0          0   0    0
John Fowler      0          1        1          0      0      0            0      0          0   0    0
Messi            0          1        0          0      0      0            0      0          0   0    0
Peter Pan        0          1        0          0      0      0            0      0          0   0    0
UK               1          0        0          0      0      0            0      0          0   0    0
USA              1          0        0          0      0      0            0      0          0   0    0

相关问题