Конвертируйте pandas dataframe в направленный multix граф сети - PullRequest
0 голосов
/ 18 декабря 2018

У меня есть кадр данных, как показано ниже.

import pandas as pd
import networkx as nx

df = pd.DataFrame({'source': ('a','a','a', 'b', 'c', 'd'),'target': ('b','b','c', 'a', 'd', 'a'), 'weight': (1,2,3,4,5,6) })

Я хочу преобразовать его в направленный мультиграф графа networkx.Я делаю

G=nx.from_pandas_dataframe(df, 'source', 'target', ['weight'])

и получаю

G.edges(data = True)
[('d', 'a', {'weight': 6}),
 ('d', 'c', {'weight': 5}),
 ('c', 'a', {'weight': 3}),
 ('a', 'b', {'weight': 4})]
G.is_directed(), G.is_multigraph()
(False, False)

Но я хочу получить

[('d', 'a', {'weight': 6}),
 ('c', 'd', {'weight': 5}),
 ('a', 'c', {'weight': 3}),
 ('b', 'a', {'weight': 4}),
('a', 'b', {'weight': 2}),
('a', 'b', {'weight': 4})]

Я не нашел параметров для направленного & мультиграфа в этом руководство .Я могу сохранить df как текст и использовать nx.read_edgelist(), но это не удобно

Ответы [ 2 ]

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

Если вам нужен ориентированный мультиграф, вы можете сделать:

import pandas as pd
import networkx as nx

df = pd.DataFrame(
    {'source': ('a', 'a', 'a', 'b', 'c', 'd'),
     'target': ('b', 'b', 'c', 'a', 'd', 'a'),
     'weight': (1, 2, 3, 4, 5, 6)})


M = nx.from_pandas_edgelist(df, 'source', 'target', ['weight'], create_using=nx.MultiDiGraph())
print(M.is_directed(), M.is_multigraph())

print(M.edges(data=True))

Вывод

True True
[('a', 'c', {'weight': 3}), ('a', 'b', {'weight': 1}), ('a', 'b', {'weight': 2}), ('c', 'd', {'weight': 5}), ('b', 'a', {'weight': 4}), ('d', 'a', {'weight': 6})]
0 голосов
/ 18 декабря 2018

Используйте параметр create_using:

create_using (график NetworkX) - используйте указанный график для результата.По умолчанию Graph()

G=nx.from_pandas_dataframe(df, 'source', 'target', ['weight'], create_using=nx.DiGraph())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...