相关文章推荐
淡定的地瓜  ·  python ...·  6 天前    · 
酒量大的刺猬  ·  Python 字典(Dictionary) ...·  3 天前    · 
从未表白的棒棒糖  ·  python - Flask - ...·  15 小时前    · 
腹黑的爆米花  ·  Python ...·  9 月前    · 
性感的仙人掌  ·  node.js 报错 throw new ...·  1 年前    · 
英俊的刺猬  ·  javascript - ...·  1 年前    · 
Collectives™ on Stack Overflow

Find centralized, trusted content and collaborate around the technologies you use most.

Learn more about Collectives

Teams

Q&A for work

Connect and share knowledge within a single location that is structured and easy to search.

Learn more about Teams

I am trying to find the intersect of three dataframes, however the pd.intersect1d does not like to use three dataframes.

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)

Error:

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

The inclusive_list should only include column names C & D. Any help would be appreciated. Thank you.

Not going to hammer because the error makes this a bit different, but the question is very similar: stackoverflow.com/questions/48539195/… – user3483203 Jan 9, 2019 at 16:25

Why your current approach doesn't work:

intersect1d does not take N arrays, it only compares 2.

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

You can see from the definition that you are passing the third array as the assume_unique parameter, and since you are treating an array like a single boolean, you receive a ValueError.

You can extend the functionality of intersect1d to work on N arrays using functools.reduce:

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

A better approach

However, the easiest approach is to just use intersection on the Index object:

df1.columns & df2.columns & df3.columns

You can using concat

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

Note that the arguments passed to np.intersect1d (https://docs.scipy.org/doc/numpy-1.15.0/reference/generated/numpy.intersect1d.html) are expected to be two arrays (ar1 and ar2).

Passing 3 arrays means that the assume_unique variable within the function is being set as an array (expected to be a bool).

You can also use simple native python set methods if you don't want to use numpy

inclusive_list = set(df1.columns).intersection(set(df2.columns)).intersection(set(df3.columns))
                You don't need the conversion to set.  An Index object is already implemented as an "ordered, sliceable set", and you can use those operations on it already.
– user3483203
                Jan 9, 2019 at 16:27
        

Thanks for contributing an answer to Stack Overflow!

  • Please be sure to answer the question. Provide details and share your research!

But avoid

  • Asking for help, clarification, or responding to other answers.
  • Making statements based on opinion; back them up with references or personal experience.

To learn more, see our tips on writing great answers.