Estoy usando la biblioteca de pandas para leer algunos datos CSV. En mis datos, ciertas columnas contienen cadenas. La cadena "nan"
es un valor posible, al igual que una cadena vacía. Me las arreglé para que los pandas leyeran "nan" como una cadena, pero no puedo averiguar cómo hacer que no lea un valor vacío como NaN. Aquí hay datos de muestra y salida
One,Two,Three
a,1,one
b,2,two
,3,three
d,4,nan
e,5,five
nan,6,
g,7,seven
>>> pandas.read_csv('test.csv', na_values={'One': [], "Three": []})
One Two Three
0 a 1 one
1 b 2 two
2 NaN 3 three
3 d 4 nan
4 e 5 five
5 nan 6 NaN
6 g 7 seven
Lee correctamente "nan" como la cadena "nan", pero aún lee las celdas vacías como NaN. Intenté pasar str
el converters
argumento a read_csv (con converters={'One': str})
), pero todavía lee las celdas vacías como NaN.
Me doy cuenta de que puedo completar los valores después de leer, con fillna, pero ¿realmente no hay forma de decirles a los pandas que una celda vacía en una columna CSV en particular debe leerse como una cadena vacía en lugar de NaN?
keep_default_na
continuación.Respuestas:
Agregué un boleto para agregar una opción de algún tipo aquí:
https://github.com/pydata/pandas/issues/1450
Mientras tanto,
result.fillna('')
debes hacer lo que quierasEDITAR: en la versión de desarrollo (para ser 0.8.0 final) si especifica una lista vacía de
na_values
, cadenas vacías permanecerán cadenas vacías en el resultadofuente
DataFrame.fillna
. Pruebaresult.fillna('', inplace=True)
. De lo contrario, crea una copia del marco de datos.na_values
(lista o dictado indexado por columnas) comokeep_default_na
(bool). Elkeep_default_na
valor indica si los valores NA predeterminados de los pandas deben reemplazarse o agregarse. El código del OP no funciona actualmente solo porque le falta esta bandera. Para este ejemplo, podría usarpandas.read_csv('test.csv',na_values=['nan'], keep_default_na=False)
.keep_default_na
. Pero tenga en cuenta que tampoco quiere que 'nan' sea tratado como predeterminado. Agregué una explicación más completa como una nueva respuesta.keep_default_na=False
), pero el comportamiento predeterminado de los pandas en esto es malo en mi opinión. Si por alguna razón pandas read_csv infiere que una columna no es numérica, no debería cambiar automáticamente las cadenas vacías a NaN.Todavía estaba confundido después de leer las otras respuestas y comentarios. Pero la respuesta ahora parece más simple, así que aquí tienes.
Desde Pandas versión 0.9 (de 2012), puede leer su csv con celdas vacías interpretadas como cadenas vacías simplemente configurando
keep_default_na=False
:pd.read_csv('test.csv', keep_default_na=False)
Este problema se explica más claramente en
Eso se solucionó el 19 de agosto de 2012 para la versión 0.9 de Pandas en
fuente
Tenemos un argumento simple en Pandas read_csv para esto:
Utilizar:
df = pd.read_csv('test.csv', na_filter= False)
La documentación de Pandas explica claramente cómo funciona el argumento anterior.
Enlace
fuente
na_values
para reconocer "nan", pero girandona_filter
fuera del todo iría en contra de eso. De ahí mi respuesta conkeep_default_na=False
.