【问题标题】:Rounding half away from zero on entire pandas dataframe在整个 pandas 数据帧上从零四舍五入
【发布时间】:2025-12-29 02:00:06
【问题描述】:

我正在努力尝试在 pandas 数据框上获得标准回合。我知道 round() 函数的行为与设计预期的不同。

我能否就如何实现 excel 中的标准舍入获得一些帮助。我想一次性将其应用于工作中的整个 pandas 数据框。我相信我正在尝试做某种“从零舍入一半”(抱歉缺乏技术)。我对确切的方法漠不关心(希望避免循环),但只需要一个可以轻松应用于整个 pandas 数据框的解决方案。

这是一个简单的数据框。每列的四舍五入结果应为 1,2,3,4,5,6,7。

data = {
'val1': [i/2 for i in range(1,15,2)],
'val2': [i/2 for i in range(1,15,2)],
'val3': [i/2 for i in range(1,15,2)],
'val4': [i/2 for i in range(1,15,2)]
}

df = pd.DataFrame(data)

我一直在尝试将此函数应用于适用于单列的数据框,但在整个数据框上出现错误:“TypeError: cannot convert the series to

def round_adjusted(n, decimals=0):
    
    def round_half_up(n, decimals=0):
        multiplier = 10 ** decimals
        return math.floor(n*multiplier + 0.5) / multiplier

    rounded_abs = round_half_up(abs(n), decimals)
    return math.copysign(rounded_abs, n)


df['val1'].map(lambda x: round_adjusted(x,0))

输出[62]:

0   1.0
1   2.0
2   3.0
3   4.0
4   5.0
5   6.0
6   7.0
Name: val1, dtype: float64

【问题讨论】:

  • 你能举一个简单的例子来说明输入数字和想要的结果吗?比如 6.54 -> 7.00?
  • 我想要“远离零的一半”(或向无穷大的一半):如果 y 的分数正好是 0.5,那么 q = y + 0.5 如果 y 是正数,并且 q = y − 0.5 如果 y 为负数。例如,23.5 舍入为 24,-23.5 舍入为 -24。
  • 您是否要将数字四舍五入到最接近的 0.5?
  • 从零四舍五入。就像你在日常数学中四舍五入一样。我不想要银行家的四舍五入

标签: python python-3.x pandas dataframe rounding


【解决方案1】:

这可能不是最快的方法,但它会起作用:

for col in df.columns:
    df[col] = df[col].map(lambda x: round_adjusted(x, 0))

【讨论】:

  • 我很抱歉 - 我看到结果适用于 1.5 和 -1.5,但不适用于更大的值。做更多的研究。
  • 实际上并非如此,.round() 函数无法按预期工作。例如尝试回合(2.5)。更多信息可以在这里找到:docs.python.org/3/tutorial/floatingpoint.html#tut-fp-issues
  • 没问题。我上面给出的函数正在工作,我只是不知道如何将它应用到整个数据帧——遇到上面显示的错误。
  • 所以这会起作用:for col in df.columns: df[col] = df[col].map(lambda x: round_adjusted(x, 0))
  • 感谢 Cerberton,我确实意识到循环会起作用,只是想知道循环之外是否有解决方案。如果没有其他选择,我会接受您的解决方案。