我有一个带有 float (十进制)索引的 pandas DataFrame,我用它来查找值(类似于字典)。由于 float 不完全是它们应该乘以 10 的值并将其转换为整数 .astype(int)
在将其设置为索引之前。然而,这似乎做了一个 floor
而不是四舍五入。因此 1.999999999999999992 被转换为 1 而不是 2。之前使用 pandas.DataFrame.round()
方法进行舍入并不能避免这个问题,因为值仍然存储为 float 。
最初的想法(这显然引起了一个关键错误)是这样的:
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’ or ‘signed’: smallest signed int dtype
来自 pandas.to_numeric documentation (从 astype()
链接用于数字转换)。
如果要取整,需要做一个float取整,然后转成int:
df.round(0).astype(int)
根据您的需要使用其他舍入函数。
关于python - 将 float 转换为整数时的 Pandas 四舍五入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49153253/