如何在DataFrame中添加列统计每个订单的唯一产品颜色数量?
解决订单内唯一颜色数量统计的问题
嗨,这个问题我之前也碰到过,很好解决!你之前的思路方向是对的,但transform('unique')报错是因为pandas的transform方法不支持直接把'unique'当作聚合函数名——它只认count、sum、nunique这类标准化的聚合函数。
下面给你两种可行的解决方案:
方法1:直接使用nunique聚合函数(推荐)
nunique就是专门用来统计唯一值数量的聚合函数,刚好匹配你的需求,直接用transform调用它就行:
df['colors_in_basket'] = df.groupby('Order_number')['Colors'].transform('nunique')
这个方法简洁高效,会自动给每个订单的每一行填充该订单的唯一颜色数量,完美替代你之前用的count(count统计的是总条目数,包含重复项)。
方法2:用Lambda函数自定义统计逻辑
如果之后你需要扩展逻辑(比如同时保留订单内的唯一颜色列表),可以用lambda函数结合unique()和len()来实现:
# 统计唯一颜色数量 df['colors_in_basket'] = df.groupby('Order_number')['Colors'].transform(lambda x: len(x.unique())) # 额外:如果需要保留订单内的唯一颜色列表,可以加这一列 df['unique_color_list'] = df.groupby('Order_number')['Colors'].transform(lambda x: ', '.join(x.unique()))
举个实际例子验证
假设你的数据集是这样的:
| Order_number | Colors |
|---|---|
| 1001 | Red |
| 1001 | Blue |
| 1001 | Red |
| 1002 | Green |
| 1002 | Green |
运行方法1的代码后,结果会变成:
| Order_number | Colors | colors_in_basket |
|---|---|---|
| 1001 | Red | 2 |
| 1001 | Blue | 2 |
| 1001 | Red | 2 |
| 1002 | Green | 1 |
| 1002 | Green | 1 |
完全符合你想要的“每个订单中的唯一颜色数量”需求!
内容的提问来源于stack exchange,提问作者Sal_H
相关产品推荐
相关产品推荐

