Python 从非';t已经是树格式
我不确定这是否可能,但我很难弄清楚从哪里开始阅读来找到答案 我有如下大量数据:Python 从非';t已经是树格式,python,tree,networkx,parent,children,Python,Tree,Networkx,Parent,Children,我不确定这是否可能,但我很难弄清楚从哪里开始阅读来找到答案 我有如下大量数据: 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
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等包一起使用?
或者,对于没有任何正式编程背景的人,有没有关于创建树数据结构的basic介绍性阅读的技巧?到目前为止,我所发现的都是假设您已经拥有了正确格式的数据,并且是关于操作它,而不是从头开始创建它。您可以尝试:
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
,以消除重复项。剩余的每一行代表一个叶节点;我们迭代所有叶节点并添加所有中间节点(以及相关边)。这太完美了!澄清一下-groupby行只是为了消除重复?由于数据的生成方式,我不会有任何重复,因此我认为出于我的目的,我可以按列对数据框进行排序,以使事情更简单。是的,这只是为了消除重复(它使数据框的索引成为与树构造相关的列集),但是任何能产生密钥列表的方法都可以:)