首页 > 解决方案 > 从尚未采用树格式的数据中自动识别父/子连接

问题描述

我不确定这是否可能,但我很难弄清楚从哪里开始阅读以找出答案。

我有大量数据,如下所示:

          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 等软件包一起使用?或者,对于没有任何正式编程背景的人,有关创建树数据结构的基本介绍性阅读的任何提示?到目前为止,我所发现的一切都假设您已经拥有正确格式的数据,并且是关于操纵它,而不是从头开始创建它。

标签: pythontreenetworkxparentchildren

解决方案


你可以试试:

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通过所有相关的列来消除重复。剩下的每一行代表一个叶子节点;我们遍历所有叶节点并添加所有中间节点(以及相关边)。


推荐阅读