Преобразование кадра данных pandas в график networkx - PullRequest
0 голосов
/ 27 декабря 2018

У меня есть фрейм данных, подобный следующему:

    X  Y
0   1  1
1   1  2
2   2  1
3   2  3
4   3  3

Я хочу создать неориентированный граф в networkx, где каждая строка фрейма данных соответствует узлу в графе (имя каждого узла должно бытьзначение индекса информационного кадра), и между узлами рисуется ребро, если эти два узла имеют одинаковые значения X или Y.Как это можно сделать?

Ответы [ 2 ]

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

Вы можете определить свои ребра, определив все пары узлов, которые имеют одинаковое значение для 'X' и одинаковое значение для 'Y', используя itertools.combinations.

import itertools.combinations as comb

edges = set()
for col in df:
    for _, data in df.groupby(col):
        edges.update(comb(data.index, 2))

G = nx.Graph()
G.add_nodes_from(df.index)
G.add_edges_from(edges)
0 голосов
/ 27 декабря 2018

IIUC:

Ваши индексы являются метками для ваших узлов.Итак, нам нужно немного изменить форму информационного кадра, чтобы создать информационный кадр списка ребер:

d1 = df.reset_index().set_index(['X',df.groupby('X').cumcount()]).unstack()['index']
d2 = df.reset_index().set_index(['Y',df.groupby('Y').cumcount()]).unstack()['index']
d3 = pd.concat([d1,d2]).set_axis(['source','target'], inplace=False, axis=1).dropna().astype(int)

G = nx.from_pandas_edgelist(d3, source='source', target='target')
nx.draw_networkx(G)

Вывод:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...