python - 识别 df 行之间的公共(public)元素以创建新列

标签 python pandas numpy dataframe

我的 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/

相关文章:

python - 如何将 tf.example 发送到 TensorFlow Serving gRPC 预测请求中

python - 如何在 pandas 中使用基于 DataFrame bool 值的条件语句

java - 使用 numpy.fromfile 在 Python 中使用 ObjectOutputStream 读取用 Java 编写的 double 的二进制文件

python - 需要帮助将两个 3 channel 图像组合成 6 channel 图像 Python

python - 非常大的 numpy 数组不会引发内存错误。它在哪里生活?

python - 将文本文件转换为Python字典

python - 从字符串中删除数字,同时保留字母数字单词

python - 如何持续运行 Python 脚本?

Python 如何计算日期后30天的月份数

python - 如何在 pandas groupby 中包含零交叉项?