将float转换为整数时,pandas舍入

Nic*_*coH 6 python floating-point int rounding pandas

我有一个带有浮点(十进制)索引的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])
Run Code Online (Sandbox Code Playgroud)

尝试转换为整数:

idx_int = idx*1000
idx_int = idx_int.astype(int)
s.index = idx_int
for i in range(1000,3000):
    print(s[i])
Run Code Online (Sandbox Code Playgroud)

输出总是有点随机,因为整数的"实数"值可能略高于或低于所需值.在这种情况下,索引包含值1000的两倍,并且不包含值2999.

Gia*_*zzi 10

你是对的,astype(int)转向零:

'integer'或'signed':最小的signed int dtype

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

如果你想要舍入,你需要进行浮点运算,然后转换为int:

df.round(0).astype(int)
Run Code Online (Sandbox Code Playgroud)

根据您的需要使用其他舍入功能.


小智 8

如果我理解正确,您可以执行舍入运算,然后将其转换为整数吗?

s1 = pd.Series([1.2,2.9])
s1 = s1.round().astype(int)
Run Code Online (Sandbox Code Playgroud)

这给出了输出:

0    1
1    3
dtype: int32
Run Code Online (Sandbox Code Playgroud)