如何在DataFrame每行的match列中提取并保留唯一值?
问题分析与解决方法
你的核心问题是没有先将逗号分隔的字符串拆分为元素列表,直接对字符串使用set会把每个字符(包括逗号)当成独立元素,自然得不到正确的去重结果。以下是两种能保留元素原始顺序的可行解法:
解法一:用dict.fromkeys实现有序去重
import pandas as pd # 构造目标DataFrame data = { 'Ville': ['Paris', 'Rome'], 'match': ['Talborjt,Talborjt,Ville Nouvelle', 'Hay Najah,Hay Najah,Najah'] } all_quartiers = pd.DataFrame(data) # 自定义去重函数:分割字符串→清理空格→有序去重→重新拼接 def get_unique_match(s): # 按逗号分割并去除每个元素前后的空格 items = [item.strip() for item in s.split(',')] # 利用字典键的唯一性去重,同时保留元素原始顺序(Python3.7+字典默认有序) unique_items = list(dict.fromkeys(items)) # 按目标格式拼接成字符串 return ', '.join(unique_items) # 生成contains列 all_quartiers['contains'] = all_quartiers['match'].apply(get_unique_match) print(all_quartiers)
解法二:用itertools.groupby实现有序去重
如果偏好使用迭代工具,也可以用groupby去重:
import pandas as pd from itertools import groupby data = { 'Ville': ['Paris', 'Rome'], 'match': ['Talborjt,Talborjt,Ville Nouvelle', 'Hay Najah,Hay Najah,Najah'] } all_quartiers = pd.DataFrame(data) def get_unique_match(s): items = [item.strip() for item in s.split(',')] # 按连续重复的元素分组,提取每组的唯一值 unique_items = [k for k, _ in groupby(items)] return ', '.join(unique_items) all_quartiers['contains'] = all_quartiers['match'].apply(get_unique_match)
输出结果
Ville match contains 0 Paris Talborjt,Talborjt,Ville Nouvelle Talborjt, Ville Nouvelle 1 Rome Hay Najah,Hay Najah,Najah Hay Najah, Najah
错误代码说明
- 前两行代码直接对字符串使用
set,会将字符串拆分为单个字符(包括逗号),完全偏离了按元素去重的需求; - 第三行代码中
explode需要match列为列表类型,而你的数据是字符串,运行会报错,且即便为列表,该代码会提取整个列的全局唯一值,而非每行的局部唯一值。
内容的提问来源于stack exchange,提问作者bravopapa
相关产品推荐
相关产品推荐

