2016-01-27 3 views
2

У меня есть Networkx graph называется G создан ниже:Сделать NetworkX узел атрибутов в столбцах Панды Dataframe

import networkx as nx 
G = nx.Graph() 
G.add_node(1,job= 'teacher', boss = 'dee') 
G.add_node(2,job= 'teacher', boss = 'foo') 
G.add_node(3,job= 'admin', boss = 'dee') 
G.add_node(4,job= 'admin', boss = 'lopez') 

Я хотел бы сохранить node номер вместе с attributes, job и boss в отдельных столбцах pandasdataframe.

Я попытался сделать это с помощью кода ниже, но он производит dataframe с 2-мя колоннами, 1 с node номером и один со всеми attributes:

graph = G.nodes(data = True) 
import pandas as pd 
df = pd.DataFrame(graph) 

df 
Out[19]: 
    0          1 
0 1 {u'job': u'teacher', u'boss': u'dee'} 
1 2 {u'job': u'teacher', u'boss': u'foo'} 
2 3 {u'job': u'admin', u'boss': u'dee'} 
3 4 {u'job': u'admin', u'boss': u'lopez'} 

Примечание: Я признаю, что NetworkX имеет to_pandas_dataframe функция, но она не дает dataframe с выходом, который я ищу.

ответ

2

Я не знаю, насколько репрезентативна ваши данные, но это должно быть простым, чтобы изменить свой код для работы на вашу реальную сеть:

In [32]: 
data={} 
data['node']=[x[0] for x in graph] 
data['boss'] = [x[1]['boss'] for x in graph] 
data['job'] = [x[1]['job'] for x in graph] 
df1 = pd.DataFrame(data) 
df1 

Out[32]: 
    boss  job node 
0 dee teacher  1 
1 foo teacher  2 
2 dee admin  3 
3 lopez admin  4 

Так вот все, что я делаю построение Dict из график данных, панды принимает dicts в качестве данных, где ключи являются имена столбцов и данные должны быть массив, как, в данном случае списков значений

более динамический метод:

In [42]: 
def func(graph): 
    data={} 
    data['node']=[x[0] for x in graph] 
    other_cols = graph[0][1].keys() 
    for key in other_cols: 
     data[key] = [x[1][key] for x in graph] 
    return data 
pd.DataFrame(func(graph)) 

Out[42]: 
    boss  job node 
0 dee teacher  1 
1 foo teacher  2 
2 dee admin  3 
3 lopez admin  4 
+0

Благодарим за решение. Единственная часть решения, которое я не понимаю, это 'x [0] для x в графе'. Я понимаю, что 'graph' является' list', но что происходит в 'x [0]' 'x' в' graph'? – BeeGee

+0

У вас есть список кортежей, первый элемент в кортеже - это значение узла, поэтому 'x [0]' второй элемент - это dict 'x [1]' – EdChum

+0

Ошибка. Это должно быть 'def func (graph):'. – MERose

0

Я обновил это решение, чтобы работать с моей обновленной версией NetworkX (2.0), и думал, что поделюсь этим. У меня также была функция вернуть Pandas DataFrame.

def nodes_to_df(graph): 
    import pandas as pd 
    data={} 
    data['node']=[x[0] for x in graph.nodes(data=True)] 
    other_cols = graph.nodes[0].keys() 
    for key in other_cols: 
     data[key] = [x[1][key] for x in graph.nodes(data=True)] 
    return pd.DataFrame(data) 
Смежные вопросы