查找多个数据框列之间的共同元素
查找多个数据框列之间的共同元素
希望你能帮助我。我是Python和Pandas的新手,所以请谅解。我正在尝试找到三个数据框之间的共同词,我正在使用Jupyter 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'])]
请告诉我我哪里出错了。谢谢。
问题:如何找到多个数据框列之间的共同元素?
解决方法:
可以使用pd.merge
中的how='inner'
关键字参数。
例如,
dfs = [df1,df2,df3] import functools as ft df_common = ft.reduce(lambda left, right: pd.merge(left, right, on='A', how='inner'), dfs)
参考:
多个数据框之间查找共同元素的问题起因是现有方法需要在多个`isin`调用之间进行链式操作。更糟糕的是,您需要追踪哪个数据框是最大的,并在该数据框上调用`isin`。否则,它将无法正常工作。
为了简化操作,可以使用`np.intersect1d`函数来解决问题。通过将多个数据框的列作为参数传递给`np.intersect1d`,即可获取它们之间的共同元素。
另一种解决方法是使用`functools.reduce`函数和`intersect1d`函数。通过将多个数据框的列作为列表传递给`reduce`函数,并指定`np.intersect1d`作为函数参数,可以获取它们之间的共同元素。
如果想要在输出中去除引号和逗号,可以将共同元素列表转换为数据框,这样输出结果会更整洁。
以上方法在数据框长度不同的情况下仍然适用。
问题的出现原因:
问题是要找到多个数据框列之间的共同元素。在这种情况下,作者遇到了一个问题:当输出结果时,元素都用单引号括起来,并用逗号分隔。作者希望以一个干净的列表的形式返回结果。
解决方法:
为了解决这个问题,作者使用了两种方法。第一种方法是使用set
的交集操作符来找到共同元素。作者使用set
函数将每个数据框列转换为一个集合,然后使用交集操作符找到这些集合的交集。这将返回一个包含共同元素的列表。第二种方法是使用functools
模块中的reduce
函数。作者首先将每个数据框列转换为集合,并使用map
函数将这些集合作为参数传递给set.intersection
函数。然后,作者使用reduce
函数将多个集合的交集计算为一个集合。最后,作者将结果转换为列表形式。
以下是中文版本的整理文章:
问题:如何找到多个数据框列之间的共同元素?
在解决这个问题时,作者尝试了两种方法。
第一种方法是使用set
的交集操作符。作者使用set
函数将每个数据框列转换为一个集合,并使用交集操作符找到这些集合的交集。下面是示例代码:
list(set(df1.A) & set(df2.A) & set(df3.A))
这将返回一个包含共同元素的列表。
第二种方法是使用functools
模块中的reduce
函数。作者首先将每个数据框列转换为集合,并使用map
函数将这些集合作为参数传递给set.intersection
函数。然后,作者使用reduce
函数将多个集合的交集计算为一个集合。下面是示例代码:
from functools import reduce list(reduce(set.intersection, map(set, [df1.A, df2.A, df3.A])))
这也将返回一个包含共同元素的列表。
然而,作者在输出结果时遇到了一个问题:元素都用单引号括起来,并用逗号分隔。如果想要以一个干净的列表的形式返回结果,可以使用以下代码:
result = list(set(df1.A) & set(df2.A) & set(df3.A))
这将返回一个干净的列表,其中包含共同元素。
希望这篇文章对你有帮助!