Автоматически идентифицировать родительские / дочерние соединения из данных, которые еще не в древовидном формате - PullRequest
0 голосов
/ 17 декабря 2018

Я не уверен, возможно ли это или нет, но мне трудно понять, с чего начать чтение, чтобы выяснить.

У меня большой объем данных, как показано ниже:

          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 вводного чтения по созданию древовидных структур данных для кого-то без какого-либо формального опыта программирования?Все, что я обнаружил до сих пор, предполагает, что у вас уже есть данные в правильном формате, и это касается манипулирования ими, а не создания их с нуля.

1 Ответ

0 голосов
/ 17 декабря 2018

Вы можете попробовать:

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()

Вывод: enter image description here

Краткое объяснение: Сначала мы groupby по всем соответствующим столбцам, чтобы исключить дубликаты.Каждая оставшаяся строка представляет собой листовой узел;мы перебираем все конечные узлы и добавляем все промежуточные узлы (вместе с соответствующим ребром).

...