在python中连接具有相似节点的元素

Posted

技术标签:

【中文标题】在python中连接具有相似节点的元素【英文标题】:connecting elements with similar nodes in python 【发布时间】:2021-10-15 16:43:49 【问题描述】:

我在想有一个python networkx 解决以下问题,但我还没有想通。假设我有以下数据框:

import pandas as pd

df_test = pd.DataFrame('ID':[100,100,200,200,300,300,400,400,500,500,600,600], 'Node':[4,5,6,4,5,8,5,7,1,5,2,3], 'Stress':[12,14,11,10,9,7,12,13,5,6,14,11])

看起来像

ID Node Stress
100 4 12
100 5 14
200 6 11
200 4 10
300 5 9
300 8 7
400 5 12
400 7 13
500 1 5
500 5 6
600 2 14
600 3 11

现在我需要做的是,构造一个函数 f(ID, lower_Stress, upper_Stress),它采用给定的 ID 和压力的上下界(包括),并输出所有连接节点的 ID 和压力在给定的 lower_Stress 和 upper_Stress 范围内的水平。

例如,f(100, 7,13) 会输出 ID:100, 200, 300, 400。请注意,ID == 500 不会被包括在内,因为虽然它有一个连接节点为 100(即 Node = = 5),其应力水平在边界之外。 ID == 600 也不包括在内,因为它的节点不与 ID==100 连接。

感谢您的帮助!

【问题讨论】:

对我来说听起来就像你有一个二分图(ID 和节点),并且可以在(ID)上创建投影,同时为边缘设置连接节点的最小和最大应力水平。然后您的函数只需要检索给定 ID 的第一个邻域并根据边缘中的最小值/最大值进行过滤。 【参考方案1】:

好的,所以我要抛出一个答案(对我自己的问题)。这可以解决问题,但可能会变得更清洁/更快:

import networkx as nx

def get_neighbors(ID, lower, upper):
  df_test = df_test[(df_test['Stress'] <= upper) & (df_test['Stress'] >= lower)]

  gs = nx.from_pandas_edgelist(df_test,'ID','Node')
  connected_components = nx.connected_components(gs)
  d = y:i for i, x in enumerate(connected_components) for y in x

  df_test['group'] = df_test.ID.replace(d)

  id_group = df_test[df_test['ID'] == ID]['group']
  id_neighbors = df_test[df_test['group'] == id_group.iloc[0]]
  
  return id_neighbors

【讨论】:

以上是关于在python中连接具有相似节点的元素的主要内容,如果未能解决你的问题,请参考以下文章

Selenium webdriver:查找具有相似ID的所有元素

从Java中具有不同大小的2个数组列表中查找非相似元素

python学习之第五篇:Python中的元组及其所具有的方法

使用 SwiftyJSON 解析具有相似元素的 JSON

定位具有相似类的每组元素的第一个兄弟

python总结三