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
相关产品推荐
相关产品推荐

