如何为Pandas DataFrame添加产品小计与总计并筛选指定列
Pandas DataFrame 添加产品小计与总计方案
1. 筛选所需列
直接通过列名列表选取需要保留的列,彻底移除多余列:
import pandas as pd # 假设你的原始数据框名为 df target_cols = ['Location', 'Product Code', 'Agvance Blend Ticket Number', 'Added Value', 'Qty', 'Trans. Cost'] df = df[target_cols]
2. 生成产品小计
通过分组聚合计算每个产品的小计,再合并到原数据中:
# 按产品代码分组计算小计 product_subtotals = df.groupby('Product Code').agg( Location=('Location', lambda x: x.unique()[0] if len(x.unique()) == 1 else '多地点'), 'Agvance Blend Ticket Number': lambda x: '小计', 'Added Value': 'sum', 'Qty': 'sum', 'Trans. Cost': 'sum' ).reset_index() # 给原数据和小计添加标记,方便排序 df['is_subtotal'] = False product_subtotals['is_subtotal'] = True # 合并并排序:确保同产品的明细行在前,小计行在后 combined = pd.concat([df, product_subtotals]).sort_values(by=['Product Code', 'is_subtotal']) # 移除临时标记列 combined = combined.drop('is_subtotal', axis=1)
3. 添加全局总计
计算所有行的汇总值,追加到数据框末尾:
# 生成总计行 total_row = pd.DataFrame({ 'Location': ['总计'], 'Product Code': [''], 'Agvance Blend Ticket Number': ['总计'], 'Added Value': [combined['Added Value'].sum()], 'Qty': [combined['Qty'].sum()], 'Trans. Cost': [combined['Trans. Cost'].sum()] }) # 合并得到最终数据框 final_df = pd.concat([combined, total_row], ignore_index=True)
4. 可选:美化显示(Jupyter环境)
如果需要在Jupyter中让小计和总计更醒目,可以用样式高亮:
def highlight_summary(row): if row['Agvance Blend Ticket Number'] in ['小计', '总计']: return ['font-weight: bold; background-color: #f0f0f0'] * len(row) return [''] * len(row) # 应用样式 final_df.style.apply(highlight_summary, axis=1)
关键说明
- 避开
sidetable的多索引限制,手动分组聚合的方式更灵活,完全可控列的显示 - 若同一产品对应多个
Location,可以根据业务需求调整agg中的Location处理逻辑(比如显示所有地点或标记为多地点) - 最终数据框仅保留你指定的列,同时包含每个产品的小计和全局总计
内容的提问来源于stack exchange,提问作者CptLuna
相关产品推荐
相关产品推荐

