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.
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.
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.
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.
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.
pourrait utiliser l'opérateur merge comme suit
pd.merge(df1, df2, how='inner')