2017-10-04 14 views
1

J'espère que vous pourrez m'aider. Je suis nouveau pour les pythons et les pandas, alors s'il vous plaît, supportez-moi. J'essaie de trouver le mot commun entre trois cadres de données et j'utilise Jupiter Notebook.Recherche d'éléments communs entre plusieurs colonnes de données

Juste par exemple:

df1= 
A 
dog 
cat 
cow 
duck 
snake 

df2= 
A 
pig 
snail 
bird 
dog 

df3= 
A 
eagle 
dog 
snail 
monkey 

Il n'y a qu'une seule colonne dans toutes les trames de données qui est A. Je voudrais trouver 1. le mot commun entre toutes les colonnes 2. les mots qui sont uniques à leurs propres colonnes et pas en commun. Exemple; le canard est unique à df1, l'escargot est unique à df2 et le singe est unique à df3. J'utilise le code ci-dessous pour une utilisation, mais ne pas obtenir ce que je veux simple,

df1[df1['A'].isin(df2['A']) & (df2['A']) & (df3['A'])] 

bien vouloir me faire savoir où je me trompe. Cheers

Répondre

1

Le problème avec votre approche actuelle est que vous devez chaîne appels multiples isin. Ce qui est pire, c'est que vous devez garder une trace de quel dataframe est le plus grand, et vous appelez isin sur qu'un un. Sinon, cela ne fonctionne pas.

Pour rendre les choses faciles, vous pouvez utiliser np.intersect1d:

>>> np.intersect1d(df3.A, np.intersect1d(df1.A, df2.A)) 
array(['dog'], dtype=object) 

méthode similaire en utilisant functools.reduce + intersect1dby piRSquared:

>>> from functools import reduce # python 3 only 
>>> reduce(np.intersect1d, [df1.A, df2.A, df3.A]) 
array(['dog'], dtype=object) 
+1

'réduire (np.intersect1d, [df1.A, df2.A, df3.A])' – piRSquared

+0

@piRSquared Oui ... regarde bien! Merci. –

+0

Salut coldspeed, ça marche !! Merci pour ça. Je voudrais vous poser la même question que celle que j'ai posée plus haut. Comment obtenir la sortie sans guillemets ou virgules? merci beaucoup pour votre temps et votre aide. – Tikku

2

manière la plus simple est d'utiliser set intersection

list(set(df1.A) & set(df2.A) & set(df3.A)) 

['dog'] 

Cependant, si vous avez une longue liste de ces choses, j'utiliserais reduce de functools. Cette même technique peut également être utilisée avec l'utilisation de np.intersect1d par @ cᴏʟᴅsᴘᴇᴇᴅ.

from functools import reduce 

list(reduce(set.intersection, map(set, [df1.A, df2.A, df3.A]))) 

['dog'] 
+0

Salut, merci beaucoup pour votre inout. Oui, cela fonctionne cependant quand j'obtiens la sortie ils viennent tous dans des guillemets simples séparés par des virgules. Est-il possible de les récupérer comme une liste propre. Merci beaucoup pour votre temps et votre aide. – Tikku