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

