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:
.ixEl indexador funciona bien para la versión de pandas anterior a 0.20.0, pero desde pandas 0.20.0, el.ixindexador está en desuso , por lo que debe evitar su uso. En su lugar, puede utilizar.locoilocindexadores. Puede resolver este problema de la siguiente manera:O, en una línea,
maskle ayuda a seleccionar las filas en las quedf.my_channel > 20000estáTrue, mientrasdf.loc[mask, column_name] = 0establece el valor 0 en las filas seleccionadas donde semaskmantiene en la columna cuyo nombre escolumn_name.Actualización: en este caso, debe usar
locporque si lo usailoc, obtendrá unNotImplementedErrormensaje 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,
ixse ha desaprobado a favor deloc/iloc.fuente
np.whereLa 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 booleanalocse 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
lambdafunción en unaSeriesdeDataFrameestas formas:No afirmo que sea una forma eficaz, pero funciona bien.
fuente
locaquí, 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