python - 使用networkx的有向网络和边缘权重
问题描述
我有以下熊猫日期框:
df = pd.DataFrame({
'id_emp':[13524791000109, 12053850000137, 4707821000113],
'name_emp': [
'JL Consultores',
'GRAAL OURINHOS',
'SOJA COMERCIO DE DERIVADOS DE PETROLEO LTDA'
],
'name_dep': [
'DIONILSO MATEUS MARCON',
'JOSE AUGUSTO ROSA',
'LUCIO ANTONIO MOSQUINI'
],
'donnated_value': [ 750.00, 5000.00, 27350.00],
'donnated_amount': [1,1,1],
'reimbursed_value':[36000.00,410.55, 241.22],
'amount_reimbursed': [1,2,1],
'roi':[4800.00, 8.21,0.88]
})
我需要创建一个有向网络,其中 df['name_dep'] 和 df['id_emp] 是节点。然后,数据帧的每一行提供两个节点,由具有权重的边连接。边的权重与 roi 列一致:对于 roi 的值在 0 到 100 之间,权重等于 1;介于 100 和 1000 之间,权重等于 2;最多 1000,权重等于 3。如下面的代码,我可以为特定的 name_dep 绘制一个网络:
G = nx.Graph()
deputado = 'DIONILSO MATEUS MARCON'
lista_subset_graph = list(df[df["name_dep"] == deputado]["id_emp"]) +
[deputado]
H = G.subgraph(lista_subset_graph)
nx.draw(H, style = "solid", with_labels = True)
plt.savefig("teste.png")
plt.show()
现在有必要像所有节点一样绘制网络并且在边缘上带有权重。我很感激任何帮助。
解决方案
# Create graph
G = nx.Graph()
# Add id_emp nodes
G.add_nodes_from(df['id_emp'])
# Set 'name_emp' attribute for 'name_emp' column values
for node in G.nodes:
G.nodes[node]['name_emp'] = df.loc[df['id_emp'] == node]['name_emp'].values[0]
# Add name_dep nodes
G.add_nodes_from(df['name_dep'])
# Create the new column with transformed 'roi' values
df['roi_new'] = df['roi'].apply(
lambda x: 1 if x < 100 else 2 if 100 <= x < 1000 else 3
)
# Add weighted edges
G.add_weighted_edges_from(df[['id_emp', 'name_dep', 'roi_new']].values)
PS看起来你应该交换name_dep
和name_emp
,name_emp
更适合的值name_dep
。
推荐阅读
- xslt - 如何删除文本 | xslt
- mysql - 如果等于 0,则更改运算结果
- delphi - 让 WebView2 在旧的 Delphi 版本和 Lazarus 中工作可行吗?
- javascript - 如何在 VueJS 中的选择和输入之间放置空格?
- google-chrome - Web 安全字体“Trebuchet MS, sans-serif”在 Chrome 和 Firefox 浏览器中的显示不同
- python-3.x - rumps.notification 不工作 - 静默无法显示通知
- java - 在Java中设置`URI`片段:可以抑制`URISyntaxException`
- python - 按列分组并从熊猫数据框中的其他列中选择特定值
- python - 从Python中的字符串中删除最后一行
- bluetooth-lowenergy - BLE:什么可能导致 BLE 连接建立失败