如何在Pandas DataFrame每个分组末尾添加类value_counts()统计行
Pandas 分组后追加自定义分箱统计行实现方案
两种实现路径均可满足需求,可根据最终输出场景选择。
方案1:直接生成带统计行的完整DataFrame
实现逻辑:按分组字段遍历每个子集,先保留原始业务记录,再计算各分箱在所有目标列的计数(自动补全0值的分箱项),将统计块拼接到对应分组末尾,最终合并所有分组得到完整结果。
import pandas as pd # 1. 初始化数据与配置 # 原始数据(替换为你的实际DataFrame即可) df = pd.DataFrame({ "Staff": ["Bob", "Bob", "Tom", "Tom", "Tom", "Tom"], "Document A": ["Expired", "Expiring soon", "On Time", "Expiring soon", "Expiring soon", "On Time"], "Document B": ["Expired", "On Time", "Expired", "On Time", "Expired", "On Time"] }) # 配置项:需要统计的分箱列、所有固定分箱值 doc_cols = ["Document A", "Document B"] bin_values = ["Expired", "Expiring soon", "On Time"] # 若不想手动写死分箱值,可用下面代码自动提取全量分箱 # bin_values = pd.unique(df[doc_cols].values.ravel()) # 2. 分组拼接原始数据与统计行 output_chunks = [] for group_name, group_data in df.groupby("Staff", sort=False): # 加入当前分组的原始业务记录 output_chunks.append(group_data) # 计算各列分箱计数,缺失分箱补0 stat_block = group_data[doc_cols].apply( lambda col: col.value_counts().reindex(bin_values, fill_value=0) ).reset_index().rename(columns={"index": "Staff"}) # 加入当前分组的统计块 output_chunks.append(stat_block) # 3. 合并得到最终结果 final_df = pd.concat(output_chunks, ignore_index=True)
运行后final_df的结构和预期的整表效果完全一致。
方案2:按分组导出到独立Excel工作表,每个表末尾追加统计
如果最终需要输出分Sheet的Excel文件,可直接在写入每个工作表前拼接统计行,无需生成整表,实用性更强。
# 复用方案1中的df、doc_cols、bin_values配置 with pd.ExcelWriter("员工文档状态统计.xlsx") as writer: for staff, group_data in df.groupby("Staff", sort=False): # 计算当前分组的统计块 stat_block = group_data[doc_cols].apply( lambda col: col.value_counts().reindex(bin_values, fill_value=0) ).reset_index().rename(columns={"index": "Staff"}) # 拼接原始数据与统计行 sheet_data = pd.concat([group_data, stat_block], ignore_index=True) # 写入对应员工名称的工作表,关闭索引输出 sheet_data.to_excel(writer, sheet_name=staff, index=False)
补充说明
- 统计行可通过
Staff列的值和原始业务行区分:原始行该列值为员工姓名,统计行该列值为分箱名称,后续如果需要给统计行设置加粗、填充色等Excel样式,可按这个规则定位行。 - 如果分箱有自定义排序要求,调整
bin_values列表的顺序即可控制统计行的展示顺序。
内容的提问来源于stack exchange,提问作者brandooo23
相关产品推荐
相关产品推荐

