两个或多个DataFrame列的交集

时间:2019-01-09 16:07:07

标签: python python-3.x pandas numpy

我正在尝试找到三个数据帧的交集,但是pd.intersect1d不喜欢使用三个数据帧。

import numpy as np
import pandas as pd
df1 = pd.DataFrame(np.random.randint(0,10,size=(10, 4)), columns=list('ABCD'))
df2 = pd.DataFrame(np.random.randint(0,10,size=(10, 4)), columns=list('BCDE'))
df3 = pd.DataFrame(np.random.randint(0,10,size=(10, 4)), columns=list('CDEF'))

inclusive_list = np.intersect1d(df1.columns, df2.columns, df3.columns)

错误:

ValueError: The truth value of a Index is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

inclusive_list仅应包括列名C和D。我们将提供任何帮助。谢谢。

3 个答案:

答案 0 :(得分:3)

为什么当前的方法不起作用

intersect1d不接受['f71bc81a7e7d649f0d279b5861972eae Appl', '22bfb8c1dd94b5f3813a2b25da67463f Appl', '1f98b8f3f3c8f8927eca945d59dcc1c6 Appl', 'f4e81ade7d6f9fb342541152d08e7a97 Appl', '595dbcceb1b5921f7fad73ad17ec1fe4 Appl', 'a23829cea89e42d79df01428e550191a Appl'] 数组,它仅比较2。

  

N

从定义中可以看到,您将第三个数组作为numpy.intersect1d(ar1, ar2, assume_unique=False, return_indices=False)参数进行传递,并且由于您将数组视为单个布尔值,因此会收到assume_unique


您可以使用ValueError扩展intersect1d的功能以在N数组上工作:

functools.reduce

from functools import reduce
reduce(np.intersect1d, (df1.columns, df2.columns, df3.columns))

更好的方法

但是,最简单的方法是仅在array(['C', 'D'], dtype=object) 对象上使用交集:

Index

df1.columns & df2.columns & df3.columns

答案 1 :(得分:1)

您可以使用concat

pd.concat([df1.head(1),df2.head(1),df3.head(1)],join='inner').columns
Out[81]: Index(['C', 'D'], dtype='object')

答案 2 :(得分:0)

inclusive_list = np.intersect1d(np.intersect1d(df1.columns, df2.columns), df3.columns)

请注意,传递给np.intersect1d(https://docs.scipy.org/doc/numpy-1.15.0/reference/generated/numpy.intersect1d.html)的参数应该是两个数组( ar1和ar2 )。

传递3个数组意味着该函数内的hypok_unique变量被设置为数组(预计为布尔值)。

如果您不想使用numpy,也可以使用简单的本机python set方法

inclusive_list = set(df1.columns).intersection(set(df2.columns)).intersection(set(df3.columns))