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