问题:将浮点数转换为整数时的熊猫舍入

我有一个带有浮点(十进制)索引的 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)向零转换:

“整数”或“有符号”:最小的有符号 int dtype

来自pandas.to_numeric 文档(从astype()链接到数字转换)。

如果要四舍五入,则需要先进行浮点型舍入,然后再转为int:

df.round(0).astype(int)

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

Logo

学AI,认准AI Studio!GPU算力,限时免费领,邀请好友解锁更多惊喜福利 >>>

更多推荐