Pandas按订单号分组统计产品/颜色分类计数的优化方案问询
解决方案
你不需要手动定义每个分类项的聚合规则,用批量处理的逻辑即可适配动态分类的场景,以下两种实现都可以达到目标:
方案1:独热编码批量聚合(和你现有思路一致,优化后无需手动写列名)
import pandas as pd # 你的示例数据 df = pd.DataFrame({'Product': ['X','X','Y','X','Y','W','W','Z','W','X'], 'Order #': ['01','01','02','03','03','03','04','05','05','05'], 'Price': [100,100,650,50,700,3000,2500,10,2500,150], 'Color': ['RED','BLUE','RED','RED','BLUE','GREEN','RED','BLUE','BLUE','GREEN']}) # 1. 计算订单基础统计字段 base_stats = df.groupby('Order #').agg( Product_Quant=('Product', 'count'), Total_Price=('Price', 'sum') ).reset_index() # 2. 批量处理需要统计分类计数的字段 stat_config = { 'Product': '{} total', # 产品列的命名规则 'Color': 'Color {}' # 颜色列的命名规则 } category_stats = [] for col, name_format in stat_config.items(): # 单字段独热编码+按订单求和+重命名 dummy_stat = pd.get_dummies(df[col])\ .groupby(df['Order #']).sum()\ .rename(columns=lambda x: name_format.format(x)) category_stats.append(dummy_stat) # 3. 合并所有统计结果 final_result = base_stats.join(pd.concat(category_stats, axis=1), on='Order #')
方案2:pivot_table实现(你之前没调试成功的写法参考)
核心是用aggfunc='size'统计出现次数,fill_value=0补全空值:
# 产品分类统计 product_stat = df.pivot_table( index='Order #', columns='Product', aggfunc='size', fill_value=0 ).rename(columns=lambda x: f'{x} total') # 颜色分类统计 color_stat = df.pivot_table( index='Order #', columns='Color', aggfunc='size', fill_value=0 ).rename(columns=lambda x: f'Color {x}') # 合并基础统计和分类统计 final_result = base_stats.join([product_stat, color_stat], on='Order #')
两种方案都会自动适配所有分类取值,即使后续产品、颜色新增分类项,也不需要修改代码逻辑,直接运行就能生成对应统计列。
内容的提问来源于stack exchange,提问作者jcf
相关产品推荐
相关产品推荐

