如何在Python DataFrame中按交易规模分组汇总对应交易总价?
解决方案
首先,我们可以分两步实现你的需求:先算出每单笔交易的总价和对应商品数量,再按交易规模(商品数量)汇总总价总和与交易笔数。
步骤1:计算单交易的核心指标
我们需要先基于Time和Receipt这两个唯一标识交易的字段分组,同时聚合两个关键数据:
- 每笔交易的商品数量(也就是你的「交易规模」)
- 每笔交易的总价总和
代码实现如下:
# 生成每笔交易的商品数量与总价 transaction_detail = supermarket.groupby(['Time', 'Receipt']).agg( basket_size=('total', 'size'), # 统计单交易商品数量 total_price=('total', 'sum') # 计算单交易总价 ).reset_index()
拿你给出的示例数据来说,运行这段代码后,transaction_detail会生成这样一行结果:
| Time | Receipt | basket_size | total_price |
|---|---|---|---|
| 12:24:32 | 124395 | 3 | 19.0 |
步骤2:按交易规模汇总数据
接下来,我们以basket_size(交易规模)为分组依据,汇总两个你需要的结果:
- 对应交易规模的交易笔数(和你之前用
value_counts()得到的结果一致) - 对应交易规模的所有交易总价总和
代码实现如下:
# 按交易规模汇总总价与交易笔数 basket_summary = transaction_detail.groupby('basket_size').agg( transaction_count=('basket_size', 'count'), # 交易笔数 total_revenue=('total_price', 'sum') # 总价总和 ).reset_index() # 按你想要的格式输出结果 print("交易规模 交易笔数 总价总和") for _, row in basket_summary.iterrows(): print(f"{row['basket_size']} {row['transaction_count']} {row['total_revenue']}")
完整整合代码
把两步逻辑整合到一起,完整代码如下:
# 第一步:计算每笔交易的商品数量和总价 transaction_detail = supermarket.groupby(['Time', 'Receipt']).agg( basket_size=('total', 'size'), total_price=('total', 'sum') ).reset_index() # 第二步:按交易规模汇总数据 basket_summary = transaction_detail.groupby('basket_size').agg( transaction_count=('basket_size', 'count'), total_revenue=('total_price', 'sum') ).reset_index() # 输出最终结果 print("交易规模 交易笔数 总价总和") for _, row in basket_summary.iterrows(): print(f"{row['basket_size']} {row['transaction_count']} {row['total_revenue']}")
运行后你就能得到类似这样的结果:比如交易规模1对应的18853笔交易,会同时输出它们的总价总和,其他交易规模的数据也会按同样格式展示。
内容的提问来源于stack exchange,提问作者Keyan H
相关产品推荐
相关产品推荐

