如何使用Python Pandas按产品汇总动态BP/RE列的数值?
按产品动态汇总DataFrame数值实现方案
输入DataFrame
import pandas as pd df = pd.DataFrame({'factory': ['kerala', 'kerala', 'kerala', 'delhi', 'delhi', 'goa', 'goa'], 'plant': ['', '', '', '', '', '', ''], 'market': ['', '', '', '', '', '', ''], 'product': ['A', 'B', 'C', 'A', 'B', 'A', 'B'], 'BP4-2023': [4, 4, 5, 6, 4, 5, 5], 'RE4-2023': [7, 7, 8, 8, 7, 8, 8], 'BP5-2023': [4, 4, 5, 6, 4, 5, 5], 'RE5-2023': [7, 7, 8, 8, 7, 8, 8]})
需求说明
输入DataFrame中以BP/RE开头的列是动态变化的(随年月更新),product列也可能新增产品,需要自动适配这些变化,按产品汇总对应数值列,并生成指定格式的输出(首行显示TOTAL,其余行展示各产品汇总结果,factory/plant/market列除首行外留空)。
实现代码
# 动态识别所有需要汇总的数值列(BP/RE开头的列) value_cols = [col for col in df.columns if col.startswith(('BP', 'RE'))] # 按product分组,对数值列求和 product_summary = df.groupby('product')[value_cols].sum().reset_index() # 构造TOTAL汇总行 total_row = pd.DataFrame({ 'factory': ['TOTAL'], 'plant': [''], 'market': [''], 'product': [''], **{col: [product_summary[col].sum()] for col in value_cols} }) # 合并TOTAL行与产品汇总数据,补充空值并调整列顺序 result = pd.concat([total_row, product_summary], ignore_index=True) result[['factory', 'plant', 'market']] = result[['factory', 'plant', 'market']].fillna('') result = result[df.columns] # 查看结果 print(result)
代码说明
- 动态筛选数值列:通过列表推导式自动识别所有以
BP或RE开头的列,无论后续新增多少年月的列都能适配。 - 分组汇总产品数据:直接按
product列分组,对筛选出的数值列求和,新增产品会自动被纳入分组计算。 - 构造TOTAL行:单独计算所有数值列的总和,生成首行的汇总数据。
- 格式调整:合并数据后填充空值,并保持列顺序与原DataFrame一致,确保输出格式符合要求。
内容的提问来源于stack exchange,提问作者AbinBenny
相关产品推荐
相关产品推荐

