Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫读取带有浮点值的csv文件会导致奇怪的舍入和小数位数_Python_Pandas_Csv_Floating Point_Rounding - Fatal编程技术网

Python 熊猫读取带有浮点值的csv文件会导致奇怪的舍入和小数位数

Python 熊猫读取带有浮点值的csv文件会导致奇怪的舍入和小数位数,python,pandas,csv,floating-point,rounding,Python,Pandas,Csv,Floating Point,Rounding,我有一个包含数值的csv文件,如1524.449677。小数点后总是正好有6位 当我通过pandasread\u csv导入csv文件(和其他列)时,该列将自动获取数据类型对象。我的问题是,这些值显示为2470.691137000003,实际上应该是2470.691137。或者值2484.30691显示为2484.3069100000002 在某种程度上,这似乎是一个数据类型问题。我试图在通过read_csv导入时显式提供数据类型,方法是将dtype参数设置为{'columnname':np.f

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

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

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


如何才能获得导入的值并与源csv文件中的值完全相同?

熊猫使用专用的
dec 2 bin
转换器,它会牺牲精度而不是速度

float\u precision='round\u trip'
传递到
read\u csv
可修复此问题

查看更多关于此的详细信息

处理完数据后,如果要将其保存回csv文件中,可以将
float\u 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

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

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

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


有点像黑客,但它似乎有效。如果有人对如何更好地解决这个问题有任何建议,请告诉我。

如何执行
df['col']=df['col'].astype(float)
?不会改变任何东西float\u precision='round\u trip'由于某种原因崩溃(PyQt中隐藏的错误,我没有花很多时间试图捕捉它们),但是float_precision='high'处理了我遇到的问题。谢谢。为什么它使用
pd.read\u csv()
而不指定
float\u precision
,向某些值添加额外的十进制数字?而有些值保留其小数位而不添加额外的值。