将浮点型转换为整型时的四舍五入

2022-04-01 00:00:00 python pandas floating-point rounding int

问题描述

我有一个带有浮点(小数)索引的 pandas DataFrame,我用它来查找值(类似于字典)。由于浮点数并不完全是理应的值,因此在将其设置为索引之前,将其乘以10并将其转换为整数.astype(int)。然而,这似乎是进行floor而不是四舍五入。因此,1.999999999999999992被转换为1而不是2。使用前面的pandas.DataFrame.round()方法进行四舍五入无法避免此问题,因为值仍存储为浮点数。

最初的想法(这显然是一个关键错误)是这样的:

idx = np.arange(1,3,0.001)
s = pd.Series(range(2000))
s.index=idx
print(s[2.022])

尝试转换为整数:

idx_int = idx*1000
idx_int = idx_int.astype(int)
s.index = idx_int
for i in range(1000,3000):
    print(s[i])
输出总是有点随机的,因为整数的"实数"值可能略高于或低于所需的值。在本例中,索引包含值1000的两倍,而不包含值2999。


解决方案

您是对的,astype(int)向零进行转换:

‘INTEGER’或‘SIGNED’:最小有符号整型dtype

来自pandas.to_numeric documentation(链接自astype()用于数字转换)。

如果要舍入,则需要进行浮点舍入,然后转换为int:

df.round(0).astype(int)

根据需要使用其他舍入函数。

相关文章