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

时间:2017-10-04 02:39:42

标签: python string pandas intersection series

希望你能帮助我。我是蟒蛇和熊猫的新手,所以请耐心等待。我试图找到三个数据框之间的常用词,我正在使用Jupiter Notebook。

仅举例:

df1=
A
dog
cat
cow 
duck
snake

df2=
A
pig
snail
bird
dog

df3=
A
eagle
dog 
snail
monkey

所有数据框中只有一列是A.我想找到 1.所有专栏中的常用词 2.对于他们自己的专栏而言并不相同的词。例; duck是df1独有的,snail是df2独有的,而monkey是df3独有的。我正在使用下面的代码进行一些使用,但没有得到我想要的简单,

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

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

2 个答案:

答案 0 :(得分:5)

最简单的方法是使用set交叉点

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

['dog']

但是,如果您有很长的列表,我会使用reduce中的functools。同样的技术也可以与@cᴏʟᴅsᴘᴇᴇᴅ同时使用np.intersect1d一起使用。

from functools import reduce

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

['dog']

答案 1 :(得分:3)

您当前的方法存在的问题是您需要链接多个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)