2016-11-04 5 views
1

私は再帰的に検索したい2つの列を持つ非常に大きなpandasデータフレームを持っています。 Iは直列OriginalIdを生成したいPandasデータフレームの連鎖検索

NewID, OldID 
1, 0 
2, 1 
3, 2 
5, 4 
7, 6 
8, 7 
9, 5 

NewID, OldId, OriginalId 
1, 0, 0 
2, 1, 0 
3, 2, 0 
5, 4, 4 
7, 6, 6 
8, 7, 6 
9, 5, 4 

これは自明にソートされたデータを反復することにより、各行について解くことができる次のデータフレームの入力が与えられる

OldIdが既存のNewIdを指しているかどうかを確認し、存在する場合はその行のOriginalIdをOriginalIdに設定します。

これは、以下のアルゴリズムにより、繰り返しの列をマージして更新することで解決することができます:累積和または類似経由でこれを行うにはパンダに優しい方法があるべきよう

Merge OldId to NewId. 
For any one that did not match, set OriginalId to OldId. 
If they did match, set OldId to OldId for the matched column. 
Repeat until OriginalIds are all filled in. 

を感じています。

答えて

0

簡単:

df.set_index('NewID', inplace=True) 
df.loc[:, 'OriginalId'] = df.loc[df['OldId'], 'OldID'].fillna(df['OldId']) 
+0

何NaNで埋めるために存在しなくなるまで繰り返し実行しない限り、私は、この作品とは思いません。 3行、2行を考えてみましょう。 NewId == OldIDのどこかを検索し、OldIDを取得します。しかし、操作を繰り返し、元のIDとして0を計算する必要があります。これは、上述のアルゴリズムのパンダ効率的な実装のように見える。私は誤解していますか? – user2411693

+0

あなたはあなたがそれらを使い果たすまで「OldID」を見つけ続ける必要があるということですか? – Kartik

+0

はい、OldIdがすべてのNewIdのセットにないようなエントリを見つけるまで、OldIdを連鎖させておく必要があります。 – user2411693

関連する問題