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.
3 Réponses :
inclusive_list = set(df1.columns).intersection(set(df2.columns)).intersection(set(df3.columns))
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.
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))
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')
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/...