You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对Pandas二维DataFrame按N位小数舍入且保留整体总和?

二维DataFrame保总和舍入的单行实现方案

需求背景

需要将二维DataFrame中的每个值按指定的N位小数舍入,同时保证整个DataFrame的整体总和保留到N位小数后保持不变。例如原表格总和为500.29239,按2位小数保总和舍入后,最终总和必须是500.29。

现有工具的局限:

  • pandas.DataFrame.round():仅对单个值独立舍入,无法保证整体总和符合要求
  • iteround.saferound():支持保总和的舍入逻辑,但仅适用于一维对象

单行解决方案

利用pandas的stack()/unstack()实现二维与一维的转换,结合iteround.saferound(),可以用一行代码完成需求:

import pandas as pd
import iteround

# N为指定的小数位数
df_rounded = df.stack().pipe(lambda s: pd.Series(iteround.saferound(s, decimals=N), index=s.index)).unstack()

代码逻辑说明

  1. df.stack():将二维DataFrame转换为一维Series,保留原有的行列索引信息
  2. pipe(lambda s: ...):将转换后的Series传递给lambda函数,对其值应用iteround.saferound()进行保总和舍入,同时保留原索引
  3. unstack():将处理后的一维Series转换回二维DataFrame结构,完全恢复原有的行列布局

验证示例

# 创建测试DataFrame
df = pd.DataFrame({
    'Col1': [12.3456, 78.9012],
    'Col2': [34.5678, 90.1234]
})
N = 2

# 计算目标总和(原总和保留N位小数)
target_total = round(df.sum().sum(), N)
print(f"目标总和: {target_total}")

# 执行单行舍入
df_rounded = df.stack().pipe(lambda s: pd.Series(iteround.saferound(s, decimals=N), index=s.index)).unstack()

# 检查结果总和
result_total = df_rounded.sum().sum()
print(f"舍入后总和: {result_total}")
print(f"总和匹配: {result_total == target_total}")

运行后输出:

目标总和: 215.94
舍入后总和: 215.94
总和匹配: True

内容的提问来源于stack exchange,提问作者mh0w

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 00:50:28