Pandas读取带浮点数的csv文件导致奇怪的四舍五入和小数位数

2024-05-19 12:25:54 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

在某种程度上,这似乎是一个数据类型问题。我试图在通过read_csv导入时显式地提供数据类型,方法是将dtype参数指定为{'columnname': np.float64}。但问题并没有消失。

如何获取导入的值,并将其完全显示在源csv文件中?


Tags: 文件csv方法类型read参数objectnp
2条回答

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

我有一个类似的问题,但不能完全使用相同的解决方案。不幸的是,float_precision选项只在使用C引擎而不是python引擎时存在。因此,如果由于某些其他原因(例如,因为C引擎不能将regex文本作为deliminators处理)必须使用python引擎,那么这个小“技巧”对我有效:

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

有点老套,但似乎管用。如果有人对如何更好地解决这个问题有任何建议,请告诉我。

Pandas使用一个专用的dec 2 bin转换器,这种转换器在速度方面优于精度。

float_precision='round_trip'传递给read_csv可以修复此问题。

查看this page了解更多有关此的详细信息。

处理完数据后,如果要将其保存回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

相关问题 更多 >