查找多个数据框列之间的公共元素

Posted

技术标签:

【中文标题】查找多个数据框列之间的公共元素【英文标题】:Finding common elements between multiple dataframe columns 【发布时间】:2018-03-15 08:01:10 【问题描述】:

希望你能帮助我。我是 python 和 pandas 的新手,所以请多多包涵。我正在尝试找到三个数据帧之间的共同词,并且我正在使用 Jupiter Notebook。

举例:

df1=
A
dog
cat
cow 
duck
snake

df2=
A
pig
snail
bird
dog

df3=
A
eagle
dog 
snail
monkey

所有数据框中只有一列是A。我想找到

    所有列中的常用词 它们自己的列所独有且不常见的词。

例子:

duck 是 df1 独有的,snail 是 df2 独有的,monkey 是 df3 独有的。

我正在使用下面的代码,但没有得到我想要的直接,

df1[df1['A'].isin(df2['A']) & (df2['A']) & (df3['A'])]

请让我知道我哪里出错了。干杯

【问题讨论】:

【参考方案1】:

最简单的方法是使用setintersection

list(set(df1.A) & set(df2.A) & set(df3.A))

['dog']

但是,如果您有很长的这些事情的清单,我会使用来自functoolsreduce。 @cᴏʟᴅsᴘᴇᴇᴅ 对np.intersect1d 的使用也可以使用相同的技术。

from functools import reduce

list(reduce(set.intersection, map(set, [df1.A, df2.A, df3.A])))

['dog']

【讨论】:

您好,非常感谢您的 inout。是的,它确实有效,但是当我得到输出时,它们都在用逗号分隔的单引号内。是否可以将它们作为干净列表检索。非常感谢您的时间和帮助。【参考方案2】:

您当前方法的问题是您需要链接多个isin 调用。更糟糕的是,您需要跟踪哪个数据框最大,然后您在 那个 上调用 isin。否则,它不起作用。

为方便起见,您可以使用np.intersect1d

>>> np.intersect1d(df3.A, np.intersect1d(df1.A, df2.A))
array(['dog'], dtype=object)

使用functools.reduce+intersect1dby piRSquared的类似方法:

>>> from functools import reduce # python 3 only
>>> reduce(np.intersect1d, [df1.A, df2.A, df3.A])
array(['dog'], dtype=object)

【讨论】:

reduce(np.intersect1d, [df1.A, df2.A, df3.A]) 嗨coldspeed,它的工作原理!感谢那。我想问你我上面问过的同样的问题。如何获得不带引号或逗号的输出?非常感谢您的时间和帮助。 感谢您的帮助。终于暂时想通了。刚刚将列表转换为数据框,看起来很整洁。感谢您的所有帮助。 如果数据帧具有不同的长度值,这仍然有效吗?

以上是关于查找多个数据框列之间的公共元素的主要内容,如果未能解决你的问题,请参考以下文章

查找数据框列之间最近的时间戳

查找两个不同数据框列之间的部分匹配,并在找到匹配时分配值

在熊猫数据框列中查找特定文本

如何迭代熊猫数据框列中的元素?

应用字典查找功能来比较熊猫数据框列

在熊猫数据框列中查找非数字值