2012-06-03 15 views
31

Estoy usando la biblioteca pandas para leer algunos datos CSV. En mis datos, ciertas columnas contienen cadenas. La cadena "nan" es un valor posible, como una cadena vacía. Me las arreglé para que los pandas leyeran "nan" como una cadena, pero no logro encontrar la forma de que no lea un valor vacío como NaN. He aquí los datos de la muestra y de salidaObtenga pandas.read_csv para leer valores vacíos como cadena vacía en lugar de nan

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 

correctamente lee "nan", como la cadena "nan', pero todavía se puede leer las celdas vacías como NaN. He intentado pasar en str en el argumento converters 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 decirle a los pandas que una celda vacía en una columna CSV particular debe leerse como una cadena vacía en lugar de NaN?

Respuesta

27

que añade una entrada para agregar una opción de algún tipo aquí:

https://github.com/pydata/pandas/issues/1450

Mientras tanto, result.fillna('') debe hacer lo que quiera

EDIT: en la versión de desarrollo (de 0,8 .0 final) si especifica una lista vacía de na_values, las cadenas vacías quedarán cadenas vacías en el resultado

+6

[Documentación para 'DataFrame.fillna'.] (Http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.fillna.html) Pruebe' result.fillna ('', inplace = True) '. De lo contrario, crea una copia del marco de datos. – osa

+1

siento resucitar una respuesta tan antigua, pero ¿sucedió alguna vez? Por lo que puedo decir de [este GitHub PR] (https: // github.com/pydata/pandas/pull/1522) se cerró sin haber sido fusionada, y no estoy viendo el comportamiento solicitado en pandas versión 0.14.x – drammock

+7

[Documentación] (http://pandas.pydata.org/pandas- docs/stable/generated/pandas.read_csv.html) para read_csv ahora ofrece tanto 'na_values' (list o dict indexados por columnas) como' keep_default_na' (bool). El valor 'keep_default_na' indica si los valores predeterminados de NA de pandas deben ser reemplazados o anexados. El código de OP no funciona actualmente solo porque falta esta bandera. Para este ejemplo, puede usar 'pandas.read_csv ('test.csv', na_values ​​= ['nan'], keep_default_na = False)'. – delgadom

-1

Utilice el método fillna, pero úselo dos veces 'nan' = 'nan', 'NaN' = "". Esto mantendría las coma alineadas. Si el NAN no existía, las columnas no se alinearían. Recuerde: nan no es igual a NaN.

+1

No entiendo su respuesta. Como dije, no quiero usar fillna o cualquier otra llamada al método después de la lectura. Estoy preguntando si hay una manera de hacer que la conversión tenga lugar durante la operación de lectura de CSV. – BrenBarn

+0

Downvote, ¿en serio? Tu pregunta no está clara. P: Haga que la conversión tenga lugar durante la operación de lectura CSV. A: No, hice la misma pregunta antes, ASÍ la eliminé. Tienes que procesar en dos pasos. Lo mismo es cierto para el módulo CSV, dos pasos. – Merlin

12

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), se puede leer el archivo CSV con celdas vacías interpretados como cadenas vacías, simplemente definiendo keep_default_na=False:

pd.read_csv('test.csv', keep_default_na=False) 

Este problema está más claramente explicado en

Se arregló el 19 de agosto de 2012 para la versión 0.9 de Pandas en

Cuestiones relacionadas