【问题标题】:Intersection of two or more DataFrame columns两个或多个 DataFrame 列的交集
【发布时间】:2019-06-04 11:04:01
【问题描述】:

我试图找到三个数据帧的交集,但是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。任何帮助将不胜感激。谢谢你。

【问题讨论】:

标签: python python-3.x pandas numpy


【解决方案1】:

你可以使用concat

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

【讨论】:

    【解决方案2】:

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

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

    numpy.intersect1d(ar1, ar2, assume_unique=False, return_indices=False)

    从定义中可以看出,您将第三个数组作为assume_unique 参数传递,并且由于您将数组视为单个布尔值,因此您会收到ValueError


    您可以使用functools.reduce 扩展intersect1d 的功能以处理N 数组:

    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
    

    Index(['C', 'D'], dtype='object')
    

    【讨论】:

      【解决方案3】:
      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 个数组意味着函数中的assume_unique 变量被设置为数组(预期为布尔值)。

      如果不想使用 numpy,也可以使用简单的原生 python set 方法

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

      【讨论】:

      • 您不需要设置转换。 Index 对象已经实现为“有序的、可切片的集合”,您已经可以在其上使用这些操作了。
      猜你喜欢
      • 2015-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多