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

Python Pandas:如何按列分组并合并另一列的唯一去重字符串?

问题描述

原始DataFrame如下:

id | item  | attributes
------------------------------
1  | apple | fruit, red, round
1  | apple | natural, organic
1  | apple | red
2  | pea   | a green vegetable
2  | pea   | round

注意:属性可以是单个单词或完整句子(例如a green vegetable);同一行的多个属性以逗号分隔。其中red在同一个item(apple)的不同行重复出现,属于冗余需要去除;而round分属apple和pea,不属于冗余。

需求:按id和item分组,将每个item的所有唯一属性合并为单个单元格,以逗号分隔,预期输出如下:

id | item  | attributes
------------------------------------------------
1  | apple | fruit, red, round, natural, organic
2  | pea   | a green vegetable, round

尝试过以下代码,但合并后仍有重复的red:

df['merged'] = df.groupby(['id','item']).attributes.transform(lambda x:", ".join(list(set(x))))
解决方案

你之前的代码问题在于:set(x)是对整行的attributes字符串去重,而不是拆分后的单个属性。比如第一行的"fruit, red, round"和第三行的"red"是两个不同的字符串,所以集合无法识别其中重复的red属性。

正确的处理逻辑是先拆分每个单元格的属性,清洗后收集所有分组内的属性,去重后再合并:

import pandas as pd

# 构造示例DataFrame
df = pd.DataFrame({
    'id': [1,1,1,2,2],
    'item': ['apple','apple','apple','pea','pea'],
    'attributes': ['fruit, red, round', 'natural, organic', 'red', 'a green vegetable', 'round']
})

def merge_unique_attributes(group):
    # 用集合存储属性,自动去重
    unique_attrs = set()
    for attr_str in group['attributes']:
        # 拆分属性并去除每个属性前后的空格
        for attr in attr_str.split(','):
            cleaned_attr = attr.strip()
            unique_attrs.add(cleaned_attr)
    # 将集合转为逗号分隔的字符串
    return ', '.join(unique_attrs)

# 分组应用函数,生成结果
result = df.groupby(['id', 'item'], as_index=False).apply(merge_unique_attributes).rename(columns={0: 'attributes'})

print(result)

运行后输出与预期一致:

id   item                                      attributes
0   1  apple  fruit, red, round, natural, organic
1   2    pea        a green vegetable, round

如果需要保留属性的原始出现顺序(集合是无序的),可以改用dict.fromkeys实现去重并维持顺序:

def merge_unique_attributes(group):
    attrs_list = []
    for attr_str in group['attributes']:
        for attr in attr_str.split(','):
            cleaned_attr = attr.strip()
            attrs_list.append(cleaned_attr)
    # 利用dict.fromkeys的特性去重并保留顺序
    unique_attrs = list(dict.fromkeys(attrs_list))
    return ', '.join(unique_attrs)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 15:24:20