将NetworkX节点属性设置为Pandas Dataframe列

Bee*_*Gee 4 python networkx dataframe python-2.7 pandas

我在下面创建了一个Networkx graph调用G

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')
Run Code Online (Sandbox Code Playgroud)

我想存储的node号码沿attributesjobboss在一个单独的列pandas dataframe

我试图用下面的代码来做到这一点,但它会产生一个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'}
Run Code Online (Sandbox Code Playgroud)

注意:我承认它NetworkX具有to_pandas_dataframe功能,但未提供dataframe我要查找的输出。

小智 7

这是一线。

pd.DataFrame.from_dict(dict(graph.nodes(data=True)), orient='index')
Run Code Online (Sandbox Code Playgroud)

  • 这是更pythonic的答案。 (2认同)

Mit*_*tar 5

我认为这更简单:

pandas.DataFrame.from_dict(graph.nodes, orient='index')
Run Code Online (Sandbox Code Playgroud)

无需转换为另一个字典。


EdC*_*ica 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
Run Code Online (Sandbox Code Playgroud)

所以这里我所做的就是从图形数据构建一个字典,pandas 接受字典作为数据,其中键是列名,数据必须是类似数组的,在本例中是值列表

更动态的方法:

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
Run Code Online (Sandbox Code Playgroud)