从尚未采用树格式的数据中自动识别 parent/child 个连接

Automatically identify parent/child connections from data that isn't already in tree format

我不确定这是否可行,但我很难确定从哪里开始阅读以找到答案。

我有大量如下数据:

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