Trouver l'intersection entre deux séries dans Pandas

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

Comment puis-je utiliser la fonction concat pour ce faire? J'ai essayé de travailler, mais ont été incapables de faire (je ne veux pas calculer l'intersection sur les indices de s1 et S2, mais sur les valeurs).

Merci d'avance.

26
demandé sur user7289 2013-08-06 15:58:31

5 réponses

Placer les deux séries en Python définir conteneur puis utilisez la méthode de l'intersection des ensembles:

s1.intersection(s2)

et puis retransformer en liste si nécessaire.

je viens de remarquer pandas dans l'étiquette. Peut se traduire de retour:

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

D'après les commentaires que j'ai changé ce une plus Pythonic expression, qui est plus court et plus facile à lire:

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

devrait faire l'affaire, sauf si les données de l'indice est également important de vous.

ajouté list(...) traduire l'ensemble avant d'aller au pd.Série AS pandas n'accepte pas un ensemble comme entrée directe pour une série.

33
répondu Joop 2018-07-20 14:28:17

Installation:

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

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

18
répondu eldad-a 2014-01-19 14:06:01

si vous utilisez Panda, je suppose que vous utilisez aussi NumPy. Numpy a une fonction intersect1d cela fonctionnera avec une série de Pandas.

Exemple:

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

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

11
répondu jbn 2013-08-06 12:26:44

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 duperies.

5
répondu Glen Thompson 2017-12-01 17:30:11

pourrait utiliser l'opérateur merge comme suit

pd.merge(df1, df2, how='inner')
3
répondu kvb 2016-10-17 01:35:21