使用Pandas groupby按Unique_id聚合并生成去重的逗号分隔字段值
解决分组聚合合并唯一值的问题
你之前的代码问题出在聚合函数的用法上——'first'.join是错误的语法,而且first只会提取每组的第一个值,完全没法实现提取唯一值并合并的需求。下面是能满足你要求的正确实现:
正确代码示例
import pandas as pd # 先构造你的数据集 data = { 'Unique_id': [101, 102, 101, 102, 103, 102, 103, 101], 'Name': ['ABC Ltd', 'JKL Ltd', 'ABC Ltd', 'JKL US', 'IHJ Ltd', 'JKL UK', 'IHJ US', 'ABC US'], 'Product': ['A', 'B', 'B', 'B', 'A', 'C', 'A', 'A'], 'Price': [100, 200, 200, 200, 100, 300, 100, 100] } df = pd.DataFrame(data) # 核心分组聚合逻辑:提取每组唯一值并以逗号分隔 df_agg = df.groupby('Unique_id').agg( Name=('Name', lambda x: ', '.join(pd.Series(x).unique())), Product=('Product', lambda x: ', '.join(pd.Series(x).unique())), Price=('Price', lambda x: ', '.join(pd.Series(x).unique().astype(str))) ).reset_index() print(df_agg)
代码逻辑说明
pd.Series(x).unique():先提取每组中的唯一值,避免重复内容被多次合并', '.join(...):把唯一值列表转换成逗号分隔的字符串格式- Price列需要用
astype(str)转成字符串,因为join只能处理字符串类型的元素
输出说明
运行代码后会得到符合需求的结果:
| Unique_id | Name | Product | Price |
|---|---|---|---|
| 101 | ABC Ltd, ABC US | A, B | 100 |
| 102 | JKL Ltd, JKL US, JKL UK | B, C | 200, 300 |
| 103 | IHJ Ltd, IHJ US | A | 100 |
注:你的期望输出中Unique_id=102的Price列写的是200,但原数据里该组存在200和300两个唯一Price值。如果确实需要只保留单个Price值,可以把Price的聚合逻辑改成
lambda x: str(x.unique()[0])来取第一个唯一值。
内容的提问来源于stack exchange,提问作者Srinivas K
相关产品推荐
相关产品推荐

