82 votes

Trouver l'intersection entre deux séries dans Pandas

J'ai deux séries s1 y s2 dans pandas et souhaite calculer l'intersection, c'est-à-dire l'endroit où toutes les valeurs de la série sont communes.

Comment utiliser le concat pour ce faire ? J'ai essayé de trouver une solution mais je n'y suis pas parvenu (je ne veux pas calculer l'intersection sur les indices de s1 y s2 mais sur les valeurs).

91voto

Joop Points 1108

Placez les deux séries dans le fichier définir le conteneur puis utiliser la méthode de l'intersection des ensembles :

s1.intersection(s2)

et de revenir à la liste si nécessaire.

Je viens de remarquer la présence de pandas dans l'étiquette. On peut traduire à partir de là :

pd.Series(list(set(s1).intersection(set(s2))))

Suite aux commentaires, j'ai changé cette expression en une expression plus pythonique, plus courte et plus facile à lire :

Series(list(set(s1) & set(s2)))

devrait faire l'affaire, sauf si les données d'index sont également importantes pour vous.

J'ai ajouté le list(...) pour traduire l'ensemble avant d'aller dans pd.Series car pandas n'accepte pas un ensemble comme entrée directe pour une Series.

47voto

eldad Points 371

Mise en place :

s1 = pd.Series([4,5,6,20,42])
s2 = pd.Series([1,2,3,5,42])

Horaires :

%%timeit
pd.Series(list(set(s1).intersection(set(s2))))
10000 loops, best of 3: 57.7 µs per loop

%%timeit
pd.Series(np.intersect1d(s1,s2))
1000 loops, best of 3: 659 µs per loop

%%timeit
pd.Series(np.intersect1d(s1.values,s2.values))
10000 loops, best of 3: 64.7 µs per loop

La solution numpy peut donc être comparable à la solution set même pour les petites séries, si l'on utilise la fonction values explicitement.

20voto

jbn Points 31

Si vous utilisez Pandas, je suppose que vous utilisez également NumPy. Numpy dispose d'une fonction intersect1d qui fonctionnera avec une série de Pandas.

Ejemplo:

pd.Series(np.intersect1d(pd.Series([1,2,3,5,42]), pd.Series([4,5,6,20,42])))

renverra une série contenant les valeurs 5 et 42.

16voto

Glen Thompson Points 1231

Python

s1 = pd.Series([4,5,6,20,42])
s2 = pd.Series([1,2,3,5,42])

s1[s1.isin(s2)]

R

s1  <- c(4,5,6,20,42)
s2 <- c(1,2,3,5,42)

s1[s1 %in% s2]

Editer : Ne gère pas les doublons.

4voto

kvb Points 150

On pourrait utiliser l'opérateur de fusion comme suit

pd.merge(df1, df2, how='inner')

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X