使用 pandas 数据帧为 networkx 图分配边权重。

8

我正在使用Python 3构建一个networkx图形。 我正在使用pandas数据框来提供边缘和节点给图形。 这是我的做法:

test = pd.read_csv("/home/Desktop/test_call1", delimiter = ';')

g_test = nx.from_pandas_edgelist(test, 'number', 'contactNumber', edge_attr='callDuration')

我希望的是,pandas数据框中的“callDuration”列作为networkx图的边权重,并且边的粗细也相应改变。
我还想获得前n个权重最大的边。
2个回答

8

让我们试试:

import pandas as pd
import numpy as np
import networkx as nx
import matplotlib.pyplot as plt

df = pd.DataFrame({'number':['123','234','345'],'contactnumber':['234','345','123'],'callduration':[1,2,4]})

df

G = nx.from_pandas_edgelist(df,'number','contactnumber', edge_attr='callduration')
durations = [i['callduration'] for i in dict(G.edges).values()]
labels = [i for i in dict(G.nodes).keys()]
labels = {i:i for i in dict(G.nodes).keys()}

fig, ax = plt.subplots(figsize=(12,5))
pos = nx.spring_layout(G)
nx.draw_networkx_nodes(G, pos, ax = ax, labels=True)
nx.draw_networkx_edges(G, pos, width=durations, ax=ax)
_ = nx.draw_networkx_labels(G, pos, labels, ax=ax)

输出:

在此输入图片描述


(注:该段文字是对输出结果的描述,图片已被删除)

谢谢Scott。我有多行数据,其中“number”和“contactnumber”列具有相同的值,而“callDuration”列则不同。例如,这些值可能是{'number':['123','123','345'],'contactnumber':['234','234','567'],'callduration':[1,2,4]}。 因此,我想将前两行的通话持续时间相加,以便它们可以表示为图中的单个边缘。请告诉我如何实现这一点。 - Anand Nautiyal
嗨,Scott。我已经在pandas中基于某些属性的相似性添加了行。这个任务已经完成了。但是,我仍然很难找到具有最大权重的边缘。有没有一种方法可以获取“n”个最大加权边缘? - Anand Nautiyal
嗯,@AnandNautiyal,你可以简单地查询输入数据框的最大通话持续时间。df[df.callduration.max() == df.callduration] - Scott Boston
1
可以的,Scott。但是我想使用边缘属性来找出最大值,因为我之后会使用图形对象来查找趋势。谢谢。 - Anand Nautiyal
@AnandNautiyal 好的,我认为你在 https://dev59.com/3K7la4cB1Zd3GeqPe47U#52445069 中得到了答案。 - Scott Boston

4

不要完全同意先前的说法。在计算像PageRank或介数中心性这样考虑每条边权重的不同指标时,如果将您的权重存储为边属性,则不会将其考虑在内。

请使用图形add_edges(source, target, weight, *attrs)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接