如何按客户分组后将同一DataFrame中数量和单价对应的数值相乘
实现方法
你的原代码不符合pandas的语法规范,groupby对象无法直接通过指定category取值的方式提取对应列数值计算,可通过以下两种方式实现需求:
方法1:透视表转宽表后计算(逻辑最直观)
先将长格式的df转为宽格式,把category的取值转为列,对应值取Number列的内容,之后直接做列乘法即可:
# 透视转换,index可根据实际需要保留的公共维度调整 df_pivot = df.pivot( index=['customer name', 'sales rep', 'sku', 'date'], columns='category', values='Number' ).reset_index() # 计算总价格 df_pivot['total_price'] = df_pivot['quantity'] * df_pivot['unit price'] # 若只需统计每个客户的总价格(同客户多订单可叠加) result = df_pivot.groupby('customer name')['total_price'].sum().reset_index()
方法2:groupby后自定义聚合函数计算
无需转换表结构,直接在分组后自定义计算逻辑:
def cal_total(group): quantity = group[group['category']=='quantity']['Number'].sum() unit_price = group[group['category']=='unit price']['Number'].sum() return quantity * unit_price # 按客户+sku+日期分组,避免同客户多订单计算混淆,仅按客户分组可去掉后面的维度 result = df.groupby(['customer name', 'sku', 'date']).apply(cal_total).reset_index(name='total_price')
两种方法得到的示例计算结果如下:
| customer name | total_price |
|---|---|
| Mueller and Sons | 5700 |
| Purdy and Sons | 32000 |
和你举例的计算逻辑结果一致。
内容的提问来源于stack exchange,提问作者Ruban
相关产品推荐
相关产品推荐

