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)