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

velaa5lx  于 2022-12-16  发布在  其他
关注(0)|答案(5)|浏览(246)

我创建了一个名为GNetworkx 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编号与attributesjobboss沿着存储在pandasdataframe的单独列中。
我已经尝试用下面的代码来做这件事,但是它产生了一个有2列的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函数,但它没有提供具有我所寻找的输出的dataframe

x3naxklr

x3naxklr1#

这里有一句俏皮话。

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

kqlmhetl2#

我觉得这更简单:

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

而不必转换到另一个口授。

tzdcorbm

tzdcorbm3#

我不知道您的数据有多具有代表性,但修改我的代码以在您的真实的网络上工作应该很简单:

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接受字典作为数据,其中键是列名,数据必须是类似数组的,在本例中是值列表
更动态的方法:

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
guicsvcw

guicsvcw4#

我更新了这个解决方案,以配合我的更新版本的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)
iszxjhcz

iszxjhcz5#

我已经用dictionary comprehension解决了这个问题。

d = {n:dag.nodes[n] for n in dag.nodes}

df = pd.DataFrame.from_dict(d, orient='index')

字典d将节点nMap到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)

相关问题