查找多个数据框列之间的公共元素
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】:最简单的方法是使用set
intersection
list(set(df1.A) & set(df2.A) & set(df3.A))
['dog']
但是,如果您有很长的这些事情的清单,我会使用来自functools
的reduce
。 @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
+intersect1d
by 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,它的工作原理!感谢那。我想问你我上面问过的同样的问题。如何获得不带引号或逗号的输出?非常感谢您的时间和帮助。
感谢您的帮助。终于暂时想通了。刚刚将列表转换为数据框,看起来很整洁。感谢您的所有帮助。
如果数据帧具有不同的长度值,这仍然有效吗?以上是关于查找多个数据框列之间的公共元素的主要内容,如果未能解决你的问题,请参考以下文章