代码之家  ›  专栏  ›  技术社区  ›  NicoH

将浮点转换为整数时的四舍五入

  •  31
  • NicoH  · 技术社区  · 6 年前

    我有一个熊猫数据框,它有一个浮点(十进制)索引,我用它来查找值(类似于字典)。因为浮点数不完全是这个值,所以应该将它们乘以10,然后将其转换为整数 .astype(int) 在将其设置为索引之前。然而,这似乎 floor 而不是四舍五入。因此,1.9999999999992被转换为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 回复  |  直到 6 年前
        1
  •  41
  •   Bill    4 年前

    你说得对, astype(int) 进行向零的转换:

    -integer-signed-int-dtype:最小的有符号int-dtype

    从…起 pandas.to_numeric documentation (链接自 astype() 用于数字转换)。

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

    df.round(0).astype(int)
    

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

        2
  •  10
  •   Matt    6 年前

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

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

    其输出:

    0    1
    1    3
    dtype: int32
    
        3
  •  2
  •   momo    3 年前

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

    df = df.applymap(lambda x: int(round(x, 0)) if isinstance(x, (int, float)) else x)
    
        4
  •  1
  •   Yuchao Jiang    3 年前

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