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

Pandas如何为DataFrame中含total的行填充对应分组小计值

Pandas 自动填充分段小计行方案

以下代码可以直接实现所有名称含total的行自动填充对应分段的Sales、Tax列汇总值,兼容多字符、带数字前缀的分组场景。

1. 复现原始测试数据

先构造和示例结构完全一致的测试数据框:

import pandas as pd

df = pd.DataFrame(
    data=[
        [109, 8], [116, 10], [104, 7], [0, 0],
        [110, 9], [130, 8], [0, 0],
        [113, 16],
        [135, 15], [110, 16], [130, 11], [151, 17], [0, 0]
    ],
    index=["A1", "A2", "A3", "A total", "B1", "B2", "B total", "C", "D1", "D2", "D3", "D4", "D total"],
    columns=["Sales", "Tax"]
)

2. 核心处理代码

# 将行标签转为普通列,方便做字符串匹配
df = df.reset_index(names="row_label")

# 生成分组标识:提取total行的前缀,向前填充给同组的明细行
df["group_flag"] = df["row_label"].str.extract(r"^(.+)(?= total)").ffill()
# 处理无对应小计行的独立条目(如示例中的C行)
df["group_flag"] = df["group_flag"].fillna(df["row_label"].str.extract(r"^([A-Za-z0-9]+)", expand=False))

# 过滤掉小计行,按分组计算销售额、税额的合计值
is_total_row = df["row_label"].str.contains("total")
group_sum = df[~is_total_row].groupby("group_flag")[["Sales", "Tax"]].sum()

# 将合计值回填到对应的小计行
df.loc[is_total_row, "Sales"] = df.loc[is_total_row, "group_flag"].map(group_sum["Sales"])
df.loc[is_total_row, "Tax"] = df.loc[is_total_row, "group_flag"].map(group_sum["Tax"])

# 恢复原表结构,删除临时列
df = df.set_index("row_label").drop(columns="group_flag")

3. 逻辑说明

  • 分组规则适配常规小计行命名格式:只要小计行命名为[分组前缀] total,不管前缀是单字符、多字符还是带数字,都能正确匹配同组明细行
  • 没有对应小计行的独立条目(比如示例中的C行)不会做任何改动
  • 处理完成后输出结果和预期完全一致:
Sales  Tax
row_label           
A1           109    8
A2           116   10
A3           104    7
A total      329   25
B1           110    9
B2           130    8
B total      240   17
C            113   16
D1           135   15
D2           110   16
D3           130   11
D4           151   17
D total      526   59

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 14:39:17