2016-11-04 91 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