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

