[英]Make NetworkX node attributes into Pandas Dataframe columns
我在下面创建了一个名为G
的Networkx graph
:
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
一起存储在pandas
dataframe
的单独列中。
我试图用下面的代码来做到这一点,但它产生了一个包含 2 列的dataframe
,1 列带有node
号,1 列带有所有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
框。
这是一个单行。
pd.DataFrame.from_dict(dict(graph.nodes(data=True)), orient='index')
我不知道您的数据有多具代表性,但修改我的代码以便在您的真实网络上工作应该很简单:
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作为数据,其中键是列名,数据必须是数组,在这种情况下是值列表
更动态的方法:
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
我更新了此解决方案以使用我的更新版本的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)
我认为这更简单:
pandas.DataFrame.from_dict(graph.nodes, orient='index')
无需转换为另一个字典。
我已经用dictionary comprehension
解决了这个问题。
d = {n:dag.nodes[n] for n in dag.nodes}
df = pd.DataFrame.from_dict(d, orient='index')
您的字典d
将节点n
映射到dag.nodes[n]
。 第二个表达式dag.nodes[n]
本身是一个字典并带有所有属性: {attribute_name:attribute_value}
所以你的字典d
有以下形式:
{node_id : {attribute_name : attribute_value} }
我看到的优点是您不需要知道属性的名称。
如果你不想让节点 ID 作为索引而是在列中,你可以添加为最后一个命令:
df.reset_index(drop=False, inplace=True)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.