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