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

如何在Pandas DataFrame中添加用户分组唯一代码列?

问题描述

我有一个记录用户代码的DataFrame:

UserID     Code
   123        A
   123        B
   123        A
   456        C
   456        D

想要添加一列显示每个用户的所有唯一代码,得到如下结果:

UserID     Code     UniqueCodes
   123        A          [A, B]
   123        B          [A, B]
   123        A          [A, B]
   456        C          [C, D]
   456        D          [C, D]

我尝试过df.groupby(by='UserID')['Code'].agg(['unique']),但未成功;还尝试了df.groupby(by='UserID')['Code'].transform('unique'),结果报错:

'unique' is not a valid function name for transform(name)

解决方案

方法1:用transform结合lambda调用pd.unique

pandas的transform不支持直接传入字符串'unique'作为函数名,但可以通过lambda函数调用pd.unique()实现需求:

import pandas as pd

# 构造示例DataFrame
df = pd.DataFrame({
    'UserID': [123, 123, 123, 456, 456],
    'Code': ['A', 'B', 'A', 'C', 'D']
})

# 添加UniqueCodes列
df['UniqueCodes'] = df.groupby('UserID')['Code'].transform(lambda x: list(pd.unique(x)))

pd.unique()会返回去重后的数组,转成列表格式与示例输出一致,且保留代码的原始出现顺序。

方法2:先聚合再合并

先通过groupby.agg生成每个用户对应的唯一代码映射表,再合并回原DataFrame:

# 聚合得到用户-唯一代码映射
unique_codes_map = df.groupby('UserID')['Code'].agg(lambda x: list(pd.unique(x))).reset_index(name='UniqueCodes')

# 左合并回原数据
df = df.merge(unique_codes_map, on='UserID', how='left')

这种方法逻辑直观,适合需要单独处理聚合结果的场景。

方法3:使用numpy.unique(结果会排序)

如果需要对唯一代码进行排序,可以用np.unique()替代pd.unique():

import numpy as np

df['UniqueCodes'] = df.groupby('UserID')['Code'].transform(lambda x: list(np.unique(x)))

注意np.unique()会自动对结果排序,而pd.unique()保留原始顺序,可根据需求选择。

内容的提问来源于stack exchange,提问作者Bijan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 14:37:04