Encontrar la intersección entre dos series en Pandas


Tengo dos series s1 y s2 en pandas/python y quiero calcular la intersección, es decir, donde todos los valores de la serie son comunes.

¿Cómo usaría la función concat para hacer esto? He estado tratando de resolverlo pero no han podido (no quiero calcular la intersección de los índices de s1 y S2, sino en los valores).

Gracias de antemano.

Author: user7289, 2013-08-06

5 answers

Coloque ambas series en el contenedor set de Python luego use el método de intersección set:

s1.intersection(s2)

Y luego transformar de nuevo a la lista si es necesario.

Acabo de notar pandas en la etiqueta. Puede traducirse de nuevo a eso:

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

De los comentarios he cambiado esto a una expresión más pitónica, que es más corta y más fácil de leer:

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

Debería hacer el truco, excepto si los datos del índice también son importantes para usted.

Han añadido el list(...) para traducir el conjunto antes de ir a la policía.Series as pandas no acepta un conjunto como entrada directa para una Serie.

 33
Author: Joop,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-20 14:28:17

Configuración:

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

Tiempos:

%%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

Así que la solución numpy puede ser comparable a la solución set incluso para series pequeñas, si se utiliza el values explícitamente.

 18
Author: eldad-a,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-19 14:06:01

Si estás usando Panda, supongo que también estás usando NumPy. Numpy tiene una función intersect1d que funcionará con una serie de Pandas.

Ejemplo:

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

Devolverá una Serie con los valores 5 y 42.

 11
Author: jbn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
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: No maneja los duplicados.

 5
Author: Glen Thompson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-01 17:30:11

Podría usar el operador merge como sigue

pd.merge(df1, df2, how='inner')
 3
Author: kvb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-17 01:35:21