两个或多个 DataFrame 列的交集

Sta*_*cks 3 python numpy python-3.x pandas

我试图找到三个数据帧的交集,但是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)
Run Code Online (Sandbox Code Playgroud)

错误:

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

inclusive_list应只包括列名C&D.任何帮助,将不胜感激。谢谢你。

use*_*203 5

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

intersect1d不接受N数组,它只比较 2。

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))
Run Code Online (Sandbox Code Playgroud)

array(['C', 'D'], dtype=object)
Run Code Online (Sandbox Code Playgroud)

更好的方法

但是,最简单的方法是在Index对象上使用交集:

df1.columns & df2.columns & df3.columns
Run Code Online (Sandbox Code Playgroud)

Index(['C', 'D'], dtype='object')
Run Code Online (Sandbox Code Playgroud)