Pandas按Item分组统计退货总数量 过滤总数量小于5的商品并降序排序
先纠正你之前的操作误区
你之前调用的df.groupby('Item').Quantity_ordered.nunique()逻辑完全不符合需求:
nunique()的作用是统计列中去重后唯一值的个数,既不是统计商品出现的行数,也不是对数量求和- 哪怕同一个商品出现10次,只要每次的
Quantity_ordered值都不同,统计结果会显示10;如果出现的数量值有重复,结果会比实际出现次数少,最终输出全为1属于函数用错导致的正常结果
完整实现流程
核心思路
按商品维度分组后对Quantity_ordered做求和聚合,再过滤阈值、排序即可,分步代码如下:
1. 聚合计算每个商品的总退货量
同一商品的Price/Category/Status属于固定属性,聚合时取第一条值保留即可,代码:
# 按Item分组聚合,as_index=False避免Item变成行索引 grouped_df = df.groupby('Item', as_index=False).agg( total_refund_quantity=('Quantity_ordered', 'sum'), # 总退货量求和 Item_ID=('Item_ID', 'first'), # 保留固定属性 Price=('Price', 'first'), Category=('Category', 'first'), Status=('Status', 'first') )
2. 过滤总退货量小于5的商品
filtered_df = grouped_df[grouped_df['total_refund_quantity'] >= 5]
3. 按总退货量从高到低排序
# ignore_index=True会重新生成从0开始的行索引,避免排序后索引混乱 final_df = filtered_df.sort_values( by='total_refund_quantity', ascending=False, ignore_index=True )
简化版代码(不需要保留其他字段时用)
如果只需要商品名和对应的总退货量,不需要Item_ID/Price等额外字段,可以直接链式调用:
final_df = df.groupby('Item')['Quantity_ordered'].sum()\ .reset_index(name='total_refund_quantity')\ .query('total_refund_quantity >= 5')\ .sort_values('total_refund_quantity', ascending=False, ignore_index=True)
可选优化建议
- 如果后续要做内部报表展示,可以把
total_refund_quantity重命名为更易读的列名,比如总退货单位数 - 如果原始数据中同一商品的
Price/Category出现不一致的情况,建议先做数据校验(比如分组后看同一商品的唯一值数量),排查录入错误后再聚合
内容的提问来源于stack exchange,提问作者Courtez
相关产品推荐
相关产品推荐

