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

时间:2018-03-07 13:34:41

标签: python pandas floating-point int rounding

我有一个带有浮点(十进制)索引的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。

4 个答案:

答案 0 :(得分:7)

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

  

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

来自pandas.to_numeric documentation(从astype()链接进行数字转换)。

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

df.round(0).astype(int)

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

答案 1 :(得分:3)

如果我理解正确你可以执行舍入操作,然后将其转换为整数?

s1 = pd.Series([1.2,2.9])
s1 = s1.round().astype(int)

给出了输出:

0    1
1    3
dtype: int32

答案 2 :(得分:0)

如果数据框同时包含数字和非数字值,并且您只想触摸数字字段:

df = df.applymap(lambda x: int(round(x, 0)) if isinstance(x, (int, float)) else x)

答案 3 :(得分:0)

数据帧中可能存在 NA 作为浮点类型。所以另一种解决方案是:df.fillna(0).astype('int')