代码之家  ›  专栏  ›  技术社区  ›  Starbucks

两个或多个数据帧列的交叉点

  •  2
  • Starbucks  · 技术社区  · 6 年前

    我试图找到三个数据帧的交叉点,但是 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 回复  |  直到 6 年前
        1
  •  3
  •   user3483203    6 年前

    为什么你目前的方法行不通 :

    intersect1d 不采取 N 数组,它只比较2。

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

    从定义中可以看出,要将第三个数组作为 assume_unique 参数,由于您将数组视为单个布尔值,因此 ValueError .


    您可以扩展 相交1D 继续工作 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
    

    Index(['C', 'D'], dtype='object')
    
        2
  •  1
  •   BENY    6 年前

    你可以使用 concat

    pd.concat([df1.head(1),df2.head(1),df3.head(1)],join='inner').columns
    Out[81]: Index(['C', 'D'], dtype='object')
    
        3
  •  0
  •   emmet02    6 年前
    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个数组意味着函数中的假定唯一变量被设置为数组(预期为bool)。

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

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