什么是创建网络的有效方式"来自pandas

时间:2017-03-23 10:31:39

标签: python pandas

我是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风格解决方案?

1 个答案:

答案 0 :(得分:0)

如果我理解正确,你有两个阶段:

  1. 根据每个节点在网络中的位置对每个节点进行分类
  2. 对数据进行计算,以计算出水量,距离出口一定距离的节点数等等。
  3. 如果是这样......

    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