如何对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()
代码逻辑说明
df.stack():将二维DataFrame转换为一维Series,保留原有的行列索引信息pipe(lambda s: ...):将转换后的Series传递给lambda函数,对其值应用iteround.saferound()进行保总和舍入,同时保留原索引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
相关产品推荐
相关产品推荐

