Condicional Reemplazar Pandas


Probablemente estoy haciendo algo muy estúpido, pero estoy perplejo.

Tengo un dataframe, y quiero reemplazar los valores en una columna en particular que exceden un valor con cero. Yo había pensado que esta era una manera de lograr esto:

df[df.my_channel > 20000].my_channel = 0

Si copio el canal en un nuevo marco de datos es simple:

df2 = df.my_channel 

df2[df2 > 20000] = 0

Esto hace exactamente lo que quiero, pero parece que no funciona con el canal como parte del dataframe original.

Author: lmiguelvargasf, 2014-02-06

3 answers

.ix indexer funciona bien para pandas versión anterior a 0.20.0, pero desde pandas 0.20.0, el .ix indexer es obsoleto, por lo que debe evitar usarlo. En su lugar, puede usar .loc o iloc indexadores. Usted puede resolver este problema por:

mask = df.my_channel > 20000
column_name = 'my_channel'
df.loc[mask, column_name] = 0

mask le ayuda a seleccionar las filas en las que df.my_channel > 20000 es True, mientras que df.loc[mask, column_name] = 0establece el valor 0 a las filas seleccionadas donde mask se mantiene en la columna cuyo nombre es column_name.

Actualización: En este caso, debe utilizar loc porque si usas iloc, obtendrás un NotImplementedError que te dice que la indexación booleana basada en ilocalización en un tipo entero no está disponible.

 79
Author: lmiguelvargasf,
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-07-14 16:47:41

Intenta

df.ix[df.my_channel > 20000, 'my_channel'] = 0
 60
Author: lowtech,
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-02-06 19:08:38

Personalmente me gusta usar la función np.where que funciona de la siguiente manera:

df['X'] = np.where(df['Y']>=50, 'yes', 'no')

En su caso usted querría:

import numpy as np df['my_channel'] = np.where(df.my_channel > 20000, 0, df.my_channel)

 13
Author: seeiespi,
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-06-09 22:27:33