python - 从尚未采用树格式的数据中自动识别父/子连接
问题描述
我不确定这是否可能,但我很难弄清楚从哪里开始阅读以找出答案。
我有大量数据,如下所示:
0 1 2 3 4
xyres zres fms flts pts
11020 1 1 0 2 0
11105 1 1 1 0 5
10005 1 0 0 0 5
01106 0 1 1 0 6
01001 0 1 0 0 1
10121 1 0 1 2 1
00016 0 0 0 1 6
01127 0 1 1 2 7
01010 0 1 0 1 0
10001 1 0 0 0 1
我想将它转换为树结构,就像这样,如果每个节点左侧的变量具有相同的值,则每个节点都具有相同的父节点。
xyres zres fms flts pts
______0 ____6
| |____|
______0 1
|
| ____0
| | |____1
0 ______0
| | | ____1
| | | |
| | |____1
|______|
1 ____0
|______| |____6
1
|____
2
|____7
____0
| |____
______0 1
|
______0
| |______
1 1...etc.
|______
1 .....etc.
是否可以自动执行此操作,以便我可以获取树结构中的数据,然后可以将其与 networkx 或 pygraphviz 等软件包一起使用?或者,对于没有任何正式编程背景的人,有关创建树数据结构的基本介绍性阅读的任何提示?到目前为止,我所发现的一切都假设您已经拥有正确格式的数据,并且是关于操纵它,而不是从头开始创建它。
解决方案
你可以试试:
import matplotlib.pyplot as plt
import networkx as nx
import pandas as pd
G = nx.Graph()
df = pd.read_csv('data.csv')
keys = list(df.groupby(list(df.columns)).count().index)
def key2id(key):
return '-'.join(map(str, key))
for key in keys:
prev = None
for i in range(1, len(key) + 1):
k = key2id(key[:i])
G.add_node(k)
if prev is not None:
G.add_edge(prev, k)
prev = k
nx.draw(G, with_labels=True)
plt.show()
简短说明:首先我们groupby
通过所有相关的列来消除重复。剩下的每一行代表一个叶子节点;我们遍历所有叶节点并添加所有中间节点(以及相关边)。
推荐阅读
- javascript - ui-router (0.3.2) 不会为历史记录上的正则表达式状态参数触发`$stateChangeStart`
- java - 在 Firestore 中加入查询
- php - 动态行php的打印循环
- python - 您如何更改 tkinter 中的标签位置?
- arduino-uno - HC-05 发送无休止的 println 消息并且没有响应
- jquery - 淡入/淡出“显示更多”按钮文本
- flex-lexer - Yacc:无效字符:' '
- python - Python - os.rename(),将 *.sqlite ddbb 从一个文件夹移动到另一个文件夹
- list - 在 Haskell 中使用 list monad 列出所有元素对
- mysql - 在 MySQL 中,使用 GROUP BY 和 HAVING 从两个表中选择信息的问题