Tengo un marco de datos como a continuación
itm Date Amount
67 420 2012-09-30 00:00:00 65211
68 421 2012-09-09 00:00:00 29424
69 421 2012-09-16 00:00:00 29877
70 421 2012-09-23 00:00:00 30990
71 421 2012-09-30 00:00:00 61303
72 485 2012-09-09 00:00:00 71781
73 485 2012-09-16 00:00:00 NaN
74 485 2012-09-23 00:00:00 11072
75 485 2012-09-30 00:00:00 113702
76 489 2012-09-09 00:00:00 64731
77 489 2012-09-16 00:00:00 NaN
cuando trato de aplicar una función a la columna Cantidad, aparece el siguiente error.
ValueError: cannot convert float NaN to integer
Intenté aplicar una función usando .isnan del Módulo de Matemáticas. Probé el atributo .replace de pandas. Probé el atributo de datos .sparse de pandas 0.9. También probé si NaN == NaN en una función. También he visto este artículo ¿Cómo reemplazo los valores de NA con ceros en un marco de datos R? mientras mira otros artículos. Todos los métodos que he probado no han funcionado o no reconocen NaN. Cualquier sugerencia o solución sería apreciada.
Respuestas:
Creo que
DataFrame.fillna()
hará esto por ti.Enlace a Documentos para un marco de datos y para una Serie .
Ejemplo:
Para completar los NaN en una sola columna, seleccione solo esa columna. en este caso estoy usando inplace = True para cambiar realmente el contenido de df.
EDITAR:
Para evitar a
SettingWithCopyWarning
, use la funcionalidad integrada de columna específica:fuente
df[1]
es una vista en lugar de una copia del DF original? Obviamente, si hay una situación rara en la que es una copia, causaría un error súper problemático. ¿Hay una declaración clara sobre eso en la documentación de los pandas?No se garantiza que el corte devuelva una vista o una copia. Tu puedes hacer
fuente
Puede usar
replace
para cambiarNaN
a0
:fuente
NaN
? o también reemplazará el valor dondeNA
oNaN
comodf.fillna(0)
? Estoy buscando una solución que solo reemplace el valor donde hayNaN
y noNA
NaN
es decir, valores dondenp.isnan
es verdaderoSolo quería proporcionar un poco de actualización / caso especial, ya que parece que la gente todavía viene aquí. Si está utilizando un índice múltiple o de lo contrario está utilizando un segmentador de índices, la opción inplace = True puede no ser suficiente para actualizar el segmento que ha elegido. Por ejemplo, en un índice múltiple de nivel 2x2, esto no cambiará ningún valor (a partir de pandas 0.15):
El "problema" es que el encadenamiento rompe la capacidad de relleno para actualizar el marco de datos original. Puse "problema" entre comillas porque hay buenas razones para las decisiones de diseño que llevaron a no interpretar a través de estas cadenas en ciertas situaciones. Además, este es un ejemplo complejo (aunque realmente me encontré con él), pero lo mismo puede aplicarse a menos niveles de índices dependiendo de cómo se divida.
La solución es DataFrame.update:
¡Es una línea, se lee razonablemente bien (más o menos) y elimina cualquier desorden innecesario con variables intermedias o bucles mientras le permite aplicar fillna a cualquier segmento de varios niveles que desee!
Si alguien puede encontrar lugares donde esto no funciona, publíquelo en los comentarios, he estado jugando con él y mirando la fuente y parece resolver al menos mis problemas de corte de índice múltiple.
fuente
El siguiente código funcionó para mí.
fuente
Manera fácil de llenar los valores faltantes: -
relleno de columnas de cadena: cuando las columnas de cadena tienen valores faltantes y valores NaN.
relleno de columnas numéricas: cuando las columnas numéricas tienen valores faltantes y valores NaN.
llenar NaN con cero:
fuente
También puede usar diccionarios para completar los valores NaN de las columnas específicas en el DataFrame en lugar de llenar todos los DF con un valor único.
fuente
Teniendo en cuenta que la columna particular
Amount
en la tabla anterior es de tipo entero. Lo siguiente sería una solución:Del mismo modo, puede llenarlo con varios tipos de datos como
float
,str
etc.En particular, consideraría el tipo de datos para comparar varios valores de la misma columna.
fuente
Para reemplazar los valores na en pandas
si
inplace = False
, en lugar de actualizar el df (marco de datos), devolverá los valores modificados.fuente
Si fuera a convertirlo en un marco de datos de pandas, también puede lograr esto usando
fillna
.Esto devolverá lo siguiente:
fuente
Hay dos opciones disponibles principalmente; en caso de imputación o llenado de valores faltantes NaN / np.nan con solo reemplazos numéricos (a través de las columnas:
df['Amount'].fillna(value=None, method= ,axis=1,)
es suficiente:De la documentación:
valor: escalar, dict, Series o DataFrame Valor para usar para rellenar huecos (por ejemplo, 0), alternativamente un dict / Series / DataFrame de valores que especifican qué valor usar para cada índice (para una Serie) o columna (para un DataFrame) . (los valores que no están en dict / Series / DataFrame no se completarán). Este valor no puede ser una lista.
Lo que significa que 'cadenas' o 'constantes' ya no se pueden imputar.
Para imputaciones más especializadas, use SimpleImputer () :
fuente
Para reemplazar nan en diferentes columnas con diferentes formas:
fuente