python - 使用分组列的邻接矩阵
问题描述
我目前开始接触熊猫,我想知道是否有一个函数可以为我提供 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 是否是完成此类任务的最佳工具(可能不是),正如我所说,我还是个菜鸟。不过,我非常感谢您的帮助。谢谢!
解决方案
一种方法是建立一个网络,并从中获得邻接矩阵:
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
推荐阅读
- java - 根据用户输入分配枚举
- javascript - 以相同的顺序从链接列表中下载图像
- slider - ArrayAdapter OnItemSelectedListener 不起作用
- java - 如何定位特定文件夹以在文件选择器中打开
- python - 当函数被多次调用时,我有这个错误 TypeError: 'int' object is not callable
- ios - 基于 Bool 更新列表 - SwiftUI
- julia - 如何计算两个直方图之间的差异?
- c++ - 使用 for 循环在数组 C++ 中创建模式
- swift - 为什么不在 Swift Widget 中使用 URLSession
- javascript - 如何从 Node-Fetch 获取特定的 cookie