3
votes

Intersection de deux ou plusieurs colonnes DataFrame

J'essaie de trouver l'intersection de trois dataframes, mais le pd.intersect1d n'aime pas utiliser trois dataframes.

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

Erreur:

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)

La liste_incluse ne doit inclure que les noms de colonne C et D. Toute aide serait apprécié. Je vous remercie.


2 commentaires

Quelle est votre sortie prévue?


Je ne vais pas marteler car l'erreur rend cela un peu différent, mais la question est très similaire: stackoverflow.com/questions/48539195/...


3 Réponses :


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

1 commentaires

Vous n'avez pas besoin de la conversion pour définir. Un objet Index est déjà implémenté en tant qu '«ensemble ordonné et découpable», et vous pouvez déjà utiliser ces opérations dessus.



5
votes

Pourquoi votre approche actuelle ne fonctionne pas :

intersect1d ne prend pas les tableaux N , il en compare seulement 2. p>

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

Vous pouvez voir d'après la définition que vous passez le troisième tableau en tant que paramètre assume_unique , et puisque vous traitez un tableau comme un booléen unique, vous recevez un ValueError .


Vous pouvez étendre la fonctionnalité de intersect1d pour travailler sur des tableaux N en utilisant functools.reduce : p>

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

df1.columns & df2.columns & df3.columns

Une meilleure approche p>

Cependant, l'approche la plus simple consiste simplement à utiliser l'intersection sur l'objet Index :

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

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


0 commentaires

1
votes

Vous pouvez utiliser concat

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


0 commentaires