Pandas读取带有浮点值的csv文件导致奇怪的舍入和十进制数字

bet*_*eta 12 python csv floating-point rounding pandas

我有一个包含数值的csv文件,如1524.449677.总有6个小数位.

当我通过pandas导入csv文件(和其他列)时read_csv,该列自动获取数据类型object.我的问题是价值显示为2470.6911370000003实际应该是2470.691137.或者值2484.30691显示为2484.3069100000002.

这似乎是某种方式的数据类型问题.我试图read_csv通过给出dtype参数来导入via时显式提供数据类型{'columnname': np.float64}.问题仍然没有消失.

如何在源csv文件中获取导入和显示的值?

Pau*_*one 14

Pandas使用专用dec 2 bin转换器,在速度方面优先考虑准确性.

传递float_precision='round_trip'read_csv修复此.

有关详细信息,请查看此页面.

处理完数据后,如果要将其保存回csv文件,可以传递
float_format = "%.nf"给相应的方法.

一个完整的例子:

import pandas as pd

df_in  = pd.read_csv(source_file, float_precision='round_trip')
df_out = ... # some processing of df_in
df_out.to_csv(target_file, float_format="%.3f") # for 3 decimal places
Run Code Online (Sandbox Code Playgroud)

  • float_ precision='round_trip' 由于某种原因崩溃了(错误隐藏在 PyQt 中,我没有花很多时间试图捕获它们),但 float_ precision='high' 解决了我遇到的问题。谢谢。 (2认同)
  • 它使用“pd.read_csv()”向某些值添加额外的十进制数字而不指定“float_ precision”的原因是什么?虽然有些值保留其小数位而不添加额外的值。 (2认同)

小智 9

我意识到这是一个老问题,但也许这会对其他人有所帮助:

我有一个类似的问题,但不能完全使用相同的解决方案。不幸的是,该float_precision选项仅在使用 C 引擎时存在,而在 python 引擎中不存在。因此,如果您出于其他原因必须使用 python 引擎(例如,因为 C 引擎无法将正则表达式文本作为分隔符处理),那么这个小“技巧”​​对我有用:

pd.read_csv参数中,定义dtype='str'然后将您的数据帧转换为您想要的任何 dtype,例如df = df.astype('float64').

有点黑客,但它似乎有效。如果有人对如何以更好的方式解决此问题有任何建议,请告诉我。