Obtenga pandas.read_csv para leer valores vacíos como una cadena vacía en lugar de nan

102

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 strel convertersargumento 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?

BrenBarn
fuente
Tenga en cuenta lo más simple, responda usando la opción más reciente a keep_default_nacontinuación.
nealmcb

Respuestas:

57

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 quieras

EDITAR: 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 resultado

Wes McKinney
fuente
12
Documentación para DataFrame.fillna. Prueba result.fillna('', inplace=True). De lo contrario, crea una copia del marco de datos.
Sergey Orshanskiy
1
lamento resucitar una respuesta tan antigua, pero ¿sucedió esto alguna vez? Por lo que puedo decir de este GitHub PR , se cerró sin haberse fusionado nunca, y no veo el comportamiento solicitado en la versión 0.14.x de pandas
drammock
10
La documentación para read_csv ahora ofrece tanto na_values(lista o dictado indexado por columnas) como keep_default_na(bool). El keep_default_navalor 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 usar pandas.read_csv('test.csv',na_values=['nan'], keep_default_na=False).
Michael Delgado
@delgadom Gracias por llevarme a 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.
nealmcb
me encontré con esto de nuevo. la solución es fácil (la mejor respuesta es la siguiente 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.
Pietroppeter
114

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

nealmcb
fuente
5
Esta es claramente la mejor respuesta, debería designarse como primera solución. Gracias @nealmcb
dzof31
3
¿Por qué no es esta una respuesta más popular? He estado buscando esta solución desde ayer. ¡Gracias!
anish
7

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

Sundeep
fuente
Parece que el PO no quieren usar na_valuespara reconocer "nan", pero girando na_filterfuera del todo iría en contra de eso. De ahí mi respuesta con keep_default_na=False.
nealmcb