我是python中的新手,在浏览了关于python / pandas循环的各种问题的几个答案之后,我仍然对如何解决有关水管理数据的问题感到困惑。我试图根据其在连接节点序列中的位置对数据进行分类和聚合。 "网络"由包含下游节点的ID的每个节点形成。
原始数据包含大约53 000个项目,我将其转换为pandas数据框,看起来像这样:
subwatershedsID = pd.DataFrame({ 'ID' : ['649208-127140','649252-127305','650556-126105','687315-128898'],'ID_DOWN' : ['582500-113890','649208-127140','649252-127305','574050-114780'], 'OUTLET_ID' : ['582500-113890','582500-113890','582500-113890','574050-114780'], 'CATCH_ID' : [217,217,217,213] })
我处理离海岸最近的数据的天真方法说明了我想要实现的目标。
sbwtrshdNextToStretch = subwatershedsID.loc[subwatershedsID['ID_DOWN'] == subwatershedsID['OUTLET_ID']]
sbwtrshdNextToStretchID = sbwtrshdNextToStretch[['ID']]
sbwtrshdStepFurther = pd.merge(sbwtrshdNextToStretchID, subwatershedsID, how='inner', left_on='ID', right_on='ID_DOWN')
sbwtrshdStepFurther.rename(columns={'ID_y': 'ID'}, inplace=True)
sbwtrshdStepFurtherID = sbwtrshdStepFurther[['ID']]
sbwtrshdTwoStepsFurther = pd.merge(sbwtrshdStepFurtherID, subwatershedsID, how='inner', left_on='ID', right_on='ID_DOWN')
sbwtrshdTwoStepsFurther.rename(columns={'ID_y': 'ID'}, inplace=True)
sbwtrshdTwoStepsFurtherID = sbwtrshdTwoStepsFurther[['ID']]
subwatershedsAll = [sbwtrshdNextToStretchID, sbwtrshdStepFurtherID, sbwtrshdTwoStepsFurtherID]
subwatershedWithDistances = pd.concat(subwatershedsAll, keys=['d0', 'd1', 'd2'])
因此,这为每个节点提供了一个标识符,表明它与第一个节点之间有多少个节点,感觉应该有一种更简单的方法来实现它,显然这对于整个数据来说效果更好连续数量。但是,我的想法不断回归到在循环中编写循环,但所有建议似乎都建议避免它们,因此也不鼓励学习如何正确地编写循环。此外,关于不良循环性能的评论让我更加怀疑,因为我不确定解决53 000行的速度有多快。那么什么是一个好的python风格解决方案?
答案 0 :(得分:0)
如果我理解正确,你有两个阶段:
如果是这样......
1)使用NetworkX执行网络中相对位置的计算
NetworkX是一个出色的网络分析库,它带有现成的方法来实现这类功能。
以下是使用虚拟数据的示例:
G = nx.Graph()
G.add_nodes_from([1,2,3,4])
G.add_edges_from([(1,2),(2,3),(3,4)])
# In this example, the shortest path is all the way down the stream
nx.shortest_path(G,1,4)
> [1,2,3,4]
len(nx.shortest_path(G,1,4))
> 4
# I've shortened the path by adding a new 'edge' (connection) between 1 and 4
G.add_edges_from([(1,2),(2,3),(3,4),(1,4)])
# Result is a much shorter path of only two nodes - the source and target
nx.shortest_path(G,1,4)
> [1,4]
len(nx.shortest_path(G,1,4))
> 2
2)注释数据帧以供以后计算
以网络格式获取此数据后,您可以遍历数据并将其作为元数据添加到DataFrame
。