Python 什么是创建“一个”的有效方法;“网络”;从熊猫中的标识符数据

Python 什么是创建“一个”的有效方法;“网络”;从熊猫中的标识符数据,python,pandas,Python,Pandas,我是python的新手,在浏览了python/pandas中关于循环的各种问题的答案之后,我仍然对如何解决我关于水管理数据的问题感到困惑。我试图根据数据在连接节点序列中的位置对其进行分类和聚合。“网络”由包含下游节点的ID的每个节点形成 原始数据包含大约53000个项目,我将其转换为pandas数据帧,如下所示: subwatershedsID = pd.DataFrame({ 'ID' : ['649208-127140','649252-127305','650556-126105','68

我是python的新手,在浏览了python/pandas中关于循环的各种问题的答案之后,我仍然对如何解决我关于水管理数据的问题感到困惑。我试图根据数据在连接节点序列中的位置对其进行分类和聚合。“网络”由包含下游节点的ID的每个节点形成

原始数据包含大约53000个项目,我将其转换为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'])

因此,这为每个节点提供了一个标识符,说明它与第一个节点之间的距离,并且感觉应该有一种更简单的方法来实现它,显然,对于具有大量连续连接的整个数据来说,这种方法效果更好。然而,我的想法不断回到在循环中编写循环,但是所有的建议似乎都建议避免这样做,因此也不鼓励学习如何正确编写循环。此外,关于循环性能差的评论让我有了进一步的疑问,因为我不确定求解53000行的速度有多快。那么什么是好的python风格的解决方案呢?

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

  • 根据每个节点在网络中的位置对其进行分类
  • 对数据进行计算,以计算出水量、距离出水口一定距离的节点数等
  • 如果是的话

    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

    Hi@janne-这是一个复杂的问题,因此我无法给出具体的答案,但根据我的经验,Pandas没有任何对网络分析特别有用的内容。您可能会在网络分析方面取得一些成功。或者,如果您想循环,那么一个更简单的结构(例如字典)可能会有所帮助。NetworkX还提供了一些方法,您可以使用这些方法计算到连接到单个节点的所有节点的所有最短路径,这将在单个命令中为您提供从出口上游的所有路径:有趣。不过,单身和单身之间的选择并不是那么好。是否有某种方法可以使用一组预定义的目的地?