python - from - float64 con pandas to_csv
pandas read_csv skip columns (2)
Como se mencionó en los comentarios, es un problema de coma flotante general.
Sin embargo, puede usar la palabra clave to_csv
de to_csv
para ocultarlo:
df.to_csv(''pandasfile.csv'', float_format=''%.3f'')
o, si no desea que 0.0001 se redondee a cero:
df.to_csv(''pandasfile.csv'', float_format=''%g'')
Te regalaré:
Bob,0.085
Alice,0.005
en tu archivo de salida.
Para obtener una explicación de %g
, consulte el Mini-Idioma de la especificación de formato .
Estoy leyendo un archivo CSV con números flotantes como este:
Bob,0.085
Alice,0.005
E importar en un marco de datos, y escribir este marco de datos en un lugar nuevo
df = pd.read_csv(orig)
df.to_csv(pandasfile)
Ahora este pandasfile
tiene:
Bob,0.085000000000000006
Alice,0.0050000000000000001
¿Qué ocurre? tal vez tengo que lanzar a un tipo diferente como float32 o algo así?
Estoy usando pandas 0.9.0 y numpy 1.6.2 .
Es un error en pandas, no solo en la función "to_csv", sino también en "read_csv". No es un problema general de coma flotante, a pesar de que es cierto que la aritmética de punto flotante es un tema que exige cierto cuidado por parte del programador. Este artículo a continuación aclara un poco este tema:
http://docs.python.org/2/tutorial/floatingpoint.html
Un clásico de una línea que muestra el "problema" es ...
>>> 0.1 + 0.1 + 0.1
0.30000000000000004
... que no muestra 0.3 como uno esperaría. Por otro lado, si maneja el cálculo utilizando la aritmética de punto fijo y solo en el último paso emplea la aritmética de punto flotante , funcionará como espera. Mira esto:
>>> (1 + 1 + 1) * 1.0 / 10
0.3
Si necesita evitar desesperadamente este problema, le recomiendo que cree otro archivo CSV que contenga todas las cifras como enteros, por ejemplo multiplicando por 100, 1000 u otro factor que resulte conveniente. Dentro de su aplicación, lea el archivo CSV como de costumbre y obtendrá esas cifras enteras. Luego convierta esos valores a coma flotante, dividiendo por el mismo factor que multiplicó antes.