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