2016-11-04 59 views
1

我有一個非常大的熊貓數據框,我想遞歸查找兩列。在熊貓數據框鏈式查找

鑑於以下數據框中輸入:

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

我想產生一系列OriginalId:

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的位置,並獲取1的OldID。但是,我們需要重複操作並計算0作爲原始ID。這看起來像上述算法的熊貓高效實現。我誤解了嗎? – user2411693

+0

你的意思是你需要不斷找到''OldID',直到你用完它們? – Kartik

+0

是的,需要保持鏈接OldId,直到找到一個條目,OldId不在所有NewId的集合中。 – user2411693