Tengo un DataFrame y quiero reemplazar los valores en una columna en particular que exceden un valor con cero. Pensé que esta era una forma 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.
Respuestas:
.ix
El indexador funciona bien para la versión de pandas anterior a 0.20.0, pero desde pandas 0.20.0, el.ix
indexador está en desuso , por lo que debe evitar su uso. En su lugar, puede utilizar.loc
oiloc
indexadores. Puede resolver este problema de la siguiente manera:O, en una línea,
mask
le ayuda a seleccionar las filas en las quedf.my_channel > 20000
estáTrue
, mientrasdf.loc[mask, column_name] = 0
establece el valor 0 en las filas seleccionadas donde semask
mantiene en la columna cuyo nombre escolumn_name
.Actualización: en este caso, debe usar
loc
porque si lo usailoc
, obtendrá unNotImplementedError
mensaje que le indicará que la indexación booleana basada en iLocation en un tipo entero no está disponible .fuente
Tratar
Nota: Desde v0.20.0,
ix
se ha desaprobado a favor deloc
/iloc
.fuente
np.where
La función funciona de la siguiente manera:En tu caso querrías:
fuente
La razón por la que su marco de datos original no se actualiza es porque la indexación encadenada puede hacer que modifique una copia en lugar de una vista de su marco de datos. Los médicos dan este consejo:
Tiene algunas alternativas: -
loc
+ Indexación booleanaloc
se puede utilizar para establecer valores y admite máscaras booleanas:mask
+ Indexación booleanaPuedes asignar a tu serie:
O puede actualizar su serie en su lugar:
np.where
+ Indexación booleanaUsted puede utilizar NumPy mediante la asignación de su serie original cuando su condición es no satisfecha; sin embargo, las dos primeras soluciones son más limpias ya que cambian explícitamente solo valores especificados.
fuente
Usaría la
lambda
función en unaSeries
deDataFrame
estas formas:No afirmo que sea una forma eficaz, pero funciona bien.
fuente
loc
aquí, comodf.loc[: , 'my_column'] = df['my_column'].map(f)
. No sé si es rápido como los que agregaste a continuación.Prueba esto:
df.my_channel = df.my_channel.where(df.my_channel <= 20000, other= 0)
o
df.my_channel = df.my_channel.mask(df.my_channel > 20000, other= 0)
fuente