在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的所有元素