首页 > 解决方案 > 使用分组列的邻接矩阵

问题描述

我目前开始接触熊猫,我想知道是否有一个函数可以为我提供 DataFrame 中常见的项目类别。可视化:

这些是我拥有的数据(显然是高度简化的示例)

   Discipline   Person
0    football   Alanis
1    football  Bernard
2    football  Delilah
3  basketball  Charlie
4  basketball  Delilah
5      tennis  Charlie

我想知道哪两个人共享一个学科,理想情况下是这样的矩阵形式:

        Alanis  Bernard Charlie Delilah
Alanis  True    True    False   True    
Bernard True    True    False   True
Charlie False   False   True    True
Delilah True    True    True    True    

或者,它可以是一个返回常见类别列表的函数。
我什至不知道 pandas 是否是完成此类任务的最佳工具(可能不是),正如我所说,我还是个菜鸟。不过,我非常感谢您的帮助。谢谢!

标签: pythonpandasgraphnetworkx

解决方案


一种方法是建立一个网络,并从中获得邻接矩阵

import networkx as nx
from itertools import combinations, chain

L = df.groupby('Discipline').Person.agg(list)

G = nx.Graph()
L = [list(combinations(i,2)) for i in L.values.tolist()]
G.add_edges_from(chain.from_iterable(L))

nx.to_pandas_adjacency(G, nodelist=sorted(G.nodes())).astype(bool)

          Alanis  Bernard  Charlie  Delilah
Alanis    False     True    False     True
Bernard    True    False    False     True
Charlie   False    False    False     True
Delilah    True     True     True    False

如果要将对角线值设置为 True,则只需添加:

import numpy as np
out[:] = out.values + np.eye(out.shape[1], dtype=bool)

print(out)

         Alanis  Bernard  Charlie  Delilah
Alanis     True     True    False     True
Bernard    True     True    False     True
Charlie   False    False     True     True
Delilah    True     True     True     True

推荐阅读