2017-03-23 4 views
0

私はPythonの初心者で、Python/Pandasのループに関するさまざまな質問を閲覧した後、私は自分の問題を解決する方法を混乱させる水管理データ。私は、接続されたノードのシーケンス内の位置に基づいてデータを分類し、集約しようとしています。 「ネットワーク」は、下流にあるノードのIDを含む各ノードによって形成される。パンダの識別子データから効率的な方法を作成する

は、元のデータは、私はパンダのデータフレームに変換およそ53 000アイテムを、含まれており、このようなものになります。

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

こんにちは@janne - 複雑な質問ですので、具体的な回答はできませんが、私の経験では、Pandasにはネットワーク分析に特に役立つものは何もありません。ネットワーク解析用に設計されたhttps://networkx.github.io/で成功するかもしれません。あるいは、ループしたい場合は、より単純な構造(例えば、辞書)が役に立つかもしれません。 –

答えて

0

私が正しく理解していればあなたは二つの段階があります。

  1. をネットワーク
  2. 内の位置に基づいて、各ノードが水のボリュームのようなものをうまくするデータに対して計算を実行し分類し、ノードAの数実行するための排出口から一定の距離など

そう...

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へのメタデータとして

+0

NetworkXには、1つのノードに接続されているすべてのノードへの最短パスをすべて計算する方法もあります。これは、コンセントからすべてのパスを1つのコマンドで上流に渡す方法です。https://networkx.readthedocs.io/en /stable/reference/generated/networkx.algorithms.shortest_paths.unweighted.single_source_shortest_path.html#networkx.algorithms.shortest_paths.unweighted.single_source_shortest_path –

+0

興味深い。しかし、シングルとすべての選択肢はそれほど大きくありません。定義済みの宛先のセットを使用する方法はありますか? –

関連する問題