Python 如何从带有组(节点)和值(边)的dataframe构建networkx可视化?

Python 如何从带有组(节点)和值(边)的dataframe构建networkx可视化?,python,networkx,Python,Networkx,如果我有以下数据帧: import pandas as pd df = pd.DataFrame({'group' : ['A', 'B', 'B', 'C', 'B', 'B', 'D', 'A', 'A', 'C', 'B'], 'value' : ['green', 'blue', 'orange', 'pink', 'green', 'green', 'black', 'yellow',

如果我有以下数据帧:

import pandas as pd

df = pd.DataFrame({'group' : ['A', 'B', 'B', 'C', 'B', 'B', 'D', 'A', 'A', 'C', 'B'],
                      'value' : ['green', 'blue', 'orange', 'pink', 'green', 'green', 'black', 'yellow', 
                                 'green','pink','yellow']})

如何清理数据以构建一个
networkx
可视化,将
df['group']
值显示为“节点”,而公共
df['value']
值的数量决定节点之间连接的厚度?

我假设您指的是最简单的情况:无向图,无自循环,对于每个
,仅计算显示为
值的唯一颜色

如果您在上面的评论中另有说明,我将更改此答案

from itertools import combinations
import networkx as nx


d = df.groupby('group').agg({'value': lambda x: x.tolist()}).to_dict()['value']

combos = list(combinations(d.keys(), 2))
edge_lst = [(combo[0],
          combo[1],
          len(set(d[combo[0]]) & set(d[combo[1]])))
         for combo in combos if len(set(d[combo[0]]) & set(d[combo[1]])) > 0]

g = nx.Graph()
g.add_nodes_from(d)
g.add_weighted_edges_from(edge_lst)
g.nodes()
作为

NodeView(('A', 'B', 'C', 'D'))
EdgeDataView([('A', 'B', {'weight': 2})])
g.edges(data=True)
as

NodeView(('A', 'B', 'C', 'D'))
EdgeDataView([('A', 'B', {'weight': 2})])
如果要使用与边缘重量成比例的
边缘\u宽度
进行非常简单的可视化:

pos = nx.spring_layout(g)
edgewidth = [g[u][v]['weight'] for u, v in g.edges()]
nx.draw_networkx_nodes(g, pos)
nx.draw_networkx_edges(g, pos, width=edgewidth)
nx.draw_networkx_labels(g, pos)
plt.show()
给予

“…公共
df['value']
值的数量决定了节点之间连接的厚度…”根据计算公共值的方式有点模糊。在您的示例数据中,
'A'
'B'
节点之间的边的预期权重是多少?还不清楚是否允许自循环。图是有向图还是无向图?是的,我对自循环或有向图不感兴趣。我尝试使用虚拟数据(有时很棘手),但我想说的是,A和B节点之间的边的权重是2(我认为我计算正确),它表示唯一的公共边。但是下面的答案很有帮助(我在Bokeh有一个很好的可视化效果,但是正在努力寻找表示边缘权重的方法,这很有帮助)