Pandas float64 到 float 32 ,然后数据发生变化

use*_*453 4 python numpy pandas

我有一个包含一些浮点数据的 csv 文件。代码很简单

df = pd.read_csv(my_csv_vile)
print(df.iloc[:2,:4]
600663.XSHG  000877.XSHE  600523.XSHG  601311.XSHG
2016-01-04 09:31:00        49.40         8.05        22.79        21.80
2016-01-04 09:32:00        49.55         8.03        22.79        21.75
Run Code Online (Sandbox Code Playgroud)

然后我将其转换为 float32 以节省内存使用。

short_df = df.astype(np.float32)
print(short_df.iloc[:2,:4])
600663.XSHG  000877.XSHE  600523.XSHG  601311.XSHG
2016-01-04 09:31:00    49.400002         8.05    22.790001    21.799999
2016-01-04 09:32:00    49.549999         8.03    22.790001    21.750000
Run Code Online (Sandbox Code Playgroud)

值刚刚改变!如何才能保持数据不变呢?

(我也尝试过short_df.round(2),但打印仍然得到相同的输出)

w-m*_*w-m 5

许多十进制浮点数无法用 float64 或 float32 精确表示。如果您不熟悉该问题,请查看例如《浮点指南》 。

Pandas默认显示精度为 6 的浮点,默认输出中会删除尾随 0。

float64 可以准确地表示示例数字,精度可达(或超过)6,而 float32 则不能:

>>> print("%.6f" % np.float64(49.40))
49.400000

>>> print("%.6f" % np.float32(49.40))
49.400002
Run Code Online (Sandbox Code Playgroud)

如果您对打印 df 时超出第 2 位数字的精度不感兴趣,可以设置显示精度:

pd.set_option('precision', 2)
Run Code Online (Sandbox Code Playgroud)

然后,即使使用 float32,您也会得到相同的输出:

 >>> df.astype(np.float32)
                     600663.XSHG  000877.XSHE  600523.XSHG  601311.XSHG
2016-01-04 09:31:00        49.40         8.05        22.79        21.80
           09:32:00        49.55         8.03        22.79        21.75
Run Code Online (Sandbox Code Playgroud)

如果您想在写回 csv 文件时删除第 2 位数字以外的所有内容,请使用float_format

df.to_csv(file_name, float_format="%.2f")
Run Code Online (Sandbox Code Playgroud)