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

如何为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 17:45:19