para graficos graficas documentacion datos curso como comandos cargar and analisis python pandas nan

python - graficos - Cómo configurar una celda para NaN en un marco de datos de pandas



python and pandas (5)

Me gustaría reemplazar los valores incorrectos en una columna de un marco de datos por NaN''s.

mydata = {''x'' : [10, 50, 18, 32, 47, 20], ''y'' : [''12'', ''11'', ''N/A'', ''13'', ''15'', ''N/A'']} df = pd.DataFrame(mydata) df[df.y == ''N/A''][''y''] = np.nan

Sin embargo, la última línea falla y arroja una advertencia porque está trabajando en una copia de df. Entonces, ¿cuál es la forma correcta de manejar esto? He visto muchas soluciones con iloc o ix pero aquí, necesito usar una condición booleana.


Puede usar reemplazar:

df[''y''] = df[''y''].replace({''N/A'': np.nan})

También tenga en cuenta el parámetro inplace para replace . Puedes hacer algo como:

df.replace({''N/A'': np.nan}, inplace=True)

Esto reemplazará todas las instancias en el df sin crear una copia.

Del mismo modo, si se encuentra con otros tipos de valores desconocidos, como una cadena vacía o un valor None:

df[''y''] = df[''y''].replace({'''': np.nan}) df[''y''] = df[''y''].replace({None: np.nan})

Referencia: Pandas Latest - Reemplazar


Puedes probar estos fragmentos.

In [16]:mydata = {''x'' : [10, 50, 18, 32, 47, 20], ''y'' : [''12'', ''11'', ''N/A'', ''13'', ''15'', ''N/A'']} In [17]:df=pd.DataFrame(mydata) In [18]:df.y[df.y=="N/A"]=np.nan Out[19]:df x y 0 10 12 1 50 11 2 18 NaN 3 32 13 4 47 15 5 20 NaN


Si bien el uso de replace parece resolver el problema, me gustaría proponer una alternativa. Problema con la combinación de valores numéricos y algunos valores de cadena en la columna para no reemplazar las cadenas con np.nan, sino para hacer que toda la columna sea adecuada. Apuesto a que la columna original probablemente sea de un tipo de objeto

Name: y, dtype: object

Lo que realmente necesita es convertirlo en una columna numérica (tendrá el tipo adecuado y sería bastante más rápido), con todos los valores no numéricos reemplazados por NaN.

Por lo tanto, un buen código de conversión sería

pd.to_numeric(df[''y''], errors=''coerce'')

Especifique errors=''coerce'' para forzar cadenas que no se pueden analizar a un valor numérico para convertirse en NaN. El tipo de columna sería

Name: y, dtype: float64


solo usa replace :

In [106]: df.replace(''N/A'',np.NaN) Out[106]: x y 0 10 12 1 50 11 2 18 NaN 3 32 13 4 47 15 5 20 NaN

Lo que está intentando se llama indexación en cadena: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy

Puede usar loc para asegurarse de operar en el dF original:

In [108]: df.loc[df[''y''] == ''N/A'',''y''] = np.nan df Out[108]: x y 0 10 12 1 50 11 2 18 NaN 3 32 13 4 47 15 5 20 NaN


df.loc[df.y == ''N/A'',[''y'']] = np.nan

Esto resuelve tu problema. Con el doble [], está trabajando en una copia del DataFrame. Debe poder especificar la ubicación exacta en una llamada para poder modificarla.