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
相关产品推荐
相关产品推荐

