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行只是为了消除重复?由于数据的生成方式,我不会有任何重复,因此我认为出于我的目的,我可以按列对数据框进行排序,以使事情更简单。是的,这只是为了消除重复(它使数据框的索引成为与树构造相关的列集),但是任何能产生密钥列表的方法都可以:)