Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 数据帧中的链式查找_Python_Pandas_Data Analysis - Fatal编程技术网

Python 数据帧中的链式查找

Python 数据帧中的链式查找,python,pandas,data-analysis,Python,Pandas,Data Analysis,我有一个非常大的数据框架,有两列,我想递归查找 以下数据帧的给定输入: 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设置为Or

我有一个非常大的数据框架,有两列,我想递归查找

以下数据帧的给定输入:

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.
感觉应该有一种友好的方式通过累积总和或类似方式来实现这一点。

简单:

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


我认为这是行不通的,除非反复运行,直到没有NaN来填充。考虑3, 2行。它将查找其中的NewId==OldID,并得到OldID为1。但我们需要重复该操作并将0计算为原始ID。这看起来像是上述算法的一个高效实现。我误解了吗?你的意思是你需要一直查找“OldID”,直到它们用完为止?是的,需要一直链接OldID,直到找到一个条目,这样OldID就不在所有NewId的集合中。此外,即使在100K行数据帧上,这种实现的一个循环也相当慢。我想在数百万行上这样做。目前,老派的python迭代或应用函数是我得到的最快答案。我认为这不起作用,除非反复运行,直到没有NaN可填充为止。考虑3, 2行。它将查找其中的NewId==OldID,并得到OldID为1。但我们需要重复该操作并将0计算为原始ID。这看起来像是上述算法的一个高效实现。我误解了吗?你的意思是你需要一直查找“OldID”,直到它们用完为止?是的,需要一直链接OldID,直到找到一个条目,这样OldID就不在所有NewId的集合中。此外,即使在100K行数据帧上,这种实现的一个循环也相当慢。我想在数百万行上这样做。目前,老派的python迭代或应用函数是我得到的最快答案。