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

时间:2016-01-27 19:16:15

标签: python python-2.7 pandas dataframe networkx

我在下面创建了名为Networkx graph的{​​{1}}:

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') 号码与nodeattributesjob一起存储在boss pandas的不同列中。

我尝试使用以下代码执行此操作,但它会生成一个dataframe,其中包含2列,其中1列为dataframe,另一列包含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提供我正在寻找的输出。

4 个答案:

答案 0 :(得分:5)

这是一个单行。

pd.DataFrame.from_dict(dict(graph.nodes(data=True)), orient='index')

答案 1 :(得分: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

所以我在这里所做的就是从图形数据构造一个字典,pandas接受dicts作为数据,其中键是列名,数据必须是数组,在这种情况下,值列表< / p>

更动态的方法:

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

答案 2 :(得分:1)

我更新了此解决方案以使用我的更新版本的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)

答案 3 :(得分:0)

我认为这更简单:

pandas.DataFrame.from_dict(graph.nodes, orient='index')

无需转换为其他字典。