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

Pandas如何统计CustomerID对应去重SalesOrderId数量并新增列

Pandas按客户ID统计去重订单数新增列实现

需求说明

  • 现有Pandas DataFrame,需新增列统计每个CustomerId对应的不重复SalesOrderId总数量
  • 预期效果:同一客户ID对应的所有行,新列值统一为该客户的去重订单总数,示例数据中所有行的新列值应为3
  • 原有错误实现代码如下,运行时触发报错:
data['TotalOrders'] = data.groupby([['CustomerID','SalesOrderID']]).size().reset_index(name='count')

错误原因

原有代码存在两处核心问题:

  • 分组参数写法错误:groupby内嵌套了两层方括号,相当于把['CustomerID','SalesOrderID']整体作为单个分组键,无法匹配到对应列触发键错误
  • 赋值长度不匹配:groupby().size().reset_index()返回的是聚合后的压缩结果,行数和原DataFrame不一致,直接赋值会触发长度不匹配的报错

正确实现代码

使用groupby搭配transform方法,可在原表长度维度上返回分组统计结果,结合nunique直接统计去重后的订单数量,代码如下:

data['TotalOrders'] = data.groupby('CustomerID')['SalesOrderID'].transform('nunique')

说明:nunique会自动对分组内的SalesOrderID去重后计数,完全匹配「不重复订单总数」的统计需求,示例数据运行后所有行的TotalOrders列均返回3,符合预期。

备选实现方式

如果习惯先聚合再映射的逻辑,也可以用如下写法,效果完全一致:

# 先聚合得到每个客户的去重订单数映射表
customer_order_cnt = data.groupby('CustomerID')['SalesOrderID'].nunique()
# 通过映射给原表赋值
data['TotalOrders'] = data['CustomerID'].map(customer_order_cnt)

内容的提问来源于stack exchange,提问作者Fábio Pires

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 17:27:41