python - exclude - ¿Cómo tratar a NULL como una cadena normal con pandas?
python dropna subset (4)
La razón por la que esto sucede es que la cadena ''null''
se trata como NaN
en el análisis, puede desactivarlo pasando keep_default_na=False
además de la respuesta de @ coldspeed:
In[49]:
data = u''strings,numbers/nfoo,1/nbar,2/nnull,3''
df = pd.read_csv(io.StringIO(data), keep_default_na=False)
df
Out[49]:
strings numbers
0 foo 1
1 bar 2
2 null 3
La lista completa es:
na_values: escalar, str, similar a una lista o dict, valor predeterminado Ninguno
Cadenas adicionales para reconocer como NA / NaN. Si se pasa dict, valores específicos de NA por columna. Por defecto, los siguientes valores se interpretan como NaN: '''', ''# N / A'', ''# N / AN / A'', ''#NA'', ''-1. # IND'', ''-1. # QNAN'', ''-NaN'', ''-nan'', ''1. # IND'', ''1. # QNAN'', ''N / A'', ''NA'', ''NULL'', ''NaN'', ''n / a'', ''nan '', ''nulo''.
Tengo un archivo csv con una columna con cadenas y quiero leerlo con pandas. En este archivo, la cadena null
aparece como un valor real y no debe considerarse como un valor perdido.
Ejemplo:
import pandas as pd
from io import StringIO
data = u''strings,numbers/nfoo,1/nbar,2/nnull,3''
print(pd.read_csv(StringIO(data)))
Esto da el siguiente resultado:
strings numbers
0 foo 1
1 bar 2
2 NaN 3
¿Qué puedo hacer para obtener el valor null
tal como es (y no como NaN) en el marco de datos? Se puede asumir que el archivo no contiene ningún valor realmente faltante.
Otras respuestas son mejores para leer en un csv sin que "null" se interprete como Nan
, pero si tiene un marco de datos que quiere "arreglar", este código lo hará: df=df.fillna(''null'')
Puede especificar un argumento de converters
para la columna de string
.
pd.read_csv(StringIO(data), converters={''strings'' : str})
strings numbers
0 foo 1
1 bar 2
2 null 3
Esto evitará el análisis automático de los pandas.
Otra opción es configurar na_filter=False
:
pd.read_csv(StringIO(data), na_filter=False)
strings numbers
0 foo 1
1 bar 2
2 null 3
Esto funciona para todo el DataFrame, así que use con precaución. Recomiendo la primera opción si desea aplicar esto quirúrgicamente para seleccionar columnas en su lugar.
podemos excluir dinámicamente ''NULL''
y ''null''
del conjunto de _NA_VALUES
predeterminados _NA_VALUES
:
In [4]: na_vals = pd.io.common._NA_VALUES.difference({''NULL'',''null''})
In [5]: na_vals
Out[5]:
{'''',
''#N/A'',
''#N/A N/A'',
''#NA'',
''-1.#IND'',
''-1.#QNAN'',
''-NaN'',
''-nan'',
''1.#IND'',
''1.#QNAN'',
''N/A'',
''NA'',
''NaN'',
''n/a'',
''nan''}
y usarlo en read_csv()
:
df = pd.read_csv(io.StringIO(data), na_values=na_vals)