我们有一个表,它包含一个Id,在同一行上,引用了同一个表中的另一个Id。Id记录被引用的Id记录感染。被引用的Id本身可能有也可能没有对另一个Id的引用,它可能不存在,或者它可能成为循环引用(链接回自身)。在熊猫身上,问题看起来有点像这样:
import pandas as pd
import numpy as np
# example data frame
inp = [{'Id': 1, 'refId': np.nan},
{'Id': 2, 'refId': 1},
{'Id': 3, 'refId': 2},
{'Id': 4, 'refId': 3},
{'Id': 5, 'refId': np.nan},
{'Id': 6, 'refId': 7},
{'Id': 7, 'refId': 20},
{'Id': 8, 'refId': 9},
{'Id': 9, 'refId': 8},
{'Id': 10, 'refId': 8}
]
df = pd.DataFrame(inp)
print(df.dtypes)
我想做的是计算表中每一行的引用向后走了多远。逻辑是:
-
每行以Result=0开始:
-
如果Ref Id不是nan,则添加1,
-
如果引用的Id存在,且该引用的Id具有引用,且引用的Id引用不是反向引用,则在结果中添加1,然后
重复此步骤,直到其中一个条件不满足,然后转至
其他的
-
Else(没有引用Id,没有引用Id的引用,或
引用循环返回上一个引用),返回结果。
示例的结果应该如下所示:
Id RefId Result
1 - 0
2 1 1
3 2 2
4 3 3
5 - 0
6 7 2
7 20 1
8 9 1
9 8 1
10 8 2
我尝试过的每种方法最终都需要为引用的每一个引用创建一个新列,但这个表非常庞大,我不确定内部表引用的菊花链最终会有多长。我希望有更好的方法,这对我来说不太难学。