web-dev-qa-db-fra.com

Trouver l’intersection de deux séries dans Pandas

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

Comment pourrais-je utiliser la fonction concat pour faire cela? J'ai essayé de le résoudre mais je n'ai pas pu (je ne veux pas calculer l'intersection sur les indices de s1 et S2, mais sur les valeurs).

Merci d'avance.

45
user7289

Placez les deux séries dans le set container de Python, puis utilisez la méthode intersection set:

s1.intersection(s2)

et ensuite transformer à la liste si nécessaire.

Je viens de remarquer pandas dans la balise. Peut être traduit en cela:

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

De commentaires j'ai changé cela pour une expression plus Pythonic, qui est 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.

Ont ajouté la list(...) pour traduire l'ensemble avant de passer à pd.Series par pandas n'accepte pas un ensemble en tant qu'entrée directe pour une série.

55
Joop

Installer:

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

Donc, la solution numpy peut être comparable à la solution set même pour de petites séries, si on utilise explicitement le values.

30
eldad-a

Si vous utilisez des pandas, je suppose que vous utilisez également NumPy. Numpy a une fonction intersect1d qui fonctionnera avec une série Pandas.

Exemple:

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

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

12
jbn

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]

Edit: Ne gère pas les dupes.

7
Glen Thompson

Pourrait utiliser l'opérateur de fusion comme suit

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