我的 df 如下所示。
key val
0 A1 [1, 2, 3, 4]
1 A2 [1, 2, 7, 9]
2 A3 [1, 3, 5]
3 A4 [6, 9]
4 A5 [8]
我想创建一个名为 common 的新列,其中包含与我当前的键具有相同值的其他键。最终的数据框如下所示:
key val common
0 A1 [1, 2, 3, 4] {'A2':[1, 2], 'A3':[1, 3]}
1 A2 [1, 2, 7, 9] {'A1':[1, 2], 'A3':[1], 'A4':[9], 'A5':[7]}
2 A3 [1, 3, 5] {'A1':[1, 3], 'A2':[1]}
3 A4 [6, 9] {'A2':[9]}
4 A5 [8] {}
我能想到的唯一方法是创建一个包含空字典的列,然后有两个循环来获取结果。我想知道是否有一种简单的方法可以做到这一点。
谢谢
最佳答案
这是一种先使用explode
然后merge
的方法
s=df.explode('Val')
s=s.merge(s,on='Val').query('Key_x ! = Key_y').groupby(['Key_x','Key_y']).Val.apply(list)
l=[y.reset_index(level=0,drop=True).to_dict()for x , y in s.groupby(level=0)]
Out[73]:
[{'A2': [1, 2], 'A3': [1, 3]},
{'A1': [1, 2], 'A3': [1], 'A4': [9], 'A5': [7]},
{'A1': [1, 3], 'A2': [1]},
{'A2': [9]},
{'A2': [7]}]
df['common']=l
更新
l={x: y.reset_index(level=0,drop=True).to_dict()for x , y in s.groupby(level=0)}
df['common']=pd.Series(l).reindex(df.Key).values
关于python - 识别 df 行之间的公共(public)元素以创建新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57873651/