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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.26 12:15:03