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

m2xkgtsf  于 2022-12-06  发布在  其他
关注(0)|答案(2)|浏览(433)

我有一个csv文件,包含1524.449677之类的数值。小数点后总是正好有6位。
当我通过panda read_csv导入csv文件(和其他列)时,该列自动获得数据类型object。我的问题是,值显示为2470.6911370000003,而实际上应该是2470.691137。或者值2484.30691显示为2484.3069100000002
在某种程度上,这似乎是一个数据类型问题。我试图在通过read_csv导入时显式地提供数据类型,方法是将dtype参数指定为{'columnname': np.float64}。但问题仍然没有解决。
如何导入这些值并使其与源csv文件中的值完全相同?

bbmckpt7

bbmckpt71#

Pandas使用专用的dec 2 bin转换器,在精度和速度之间进行权衡。
float_precision='round_trip'传递给read_csv可修复此问题。
请查看此页面以了解更多详细信息。
处理完数据后,如果要将其保存回 csv 文件,可以通过
float_format = "%.nf"Map至Map的方法。
完整示例:

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
myzjeezk

myzjeezk2#

我意识到这是一个老问题,但也许这会帮助其他人:
我也遇到过类似的问题,但是不能完全使用相同的解决方案。不幸的是,float_precision选项只在使用C引擎时存在,而在使用python引擎时不存在。所以,如果你因为其他原因而不得不使用python引擎(例如,因为C引擎不能处理regex文字作为分隔符),这个小“技巧”对我很有效:
pd.read_csv参数中,定义dtype='str',然后将 Dataframe 转换为所需的任何数据类型,例如df = df.astype('float64')
有点黑客攻击,但似乎奏效了。如果有人对如何更好地解决这个问题有任何建议,请告诉我。

相关问题