仅举例:
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'])]
请让我知道我哪里出错了。干杯
答案 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)