Python中如何比较两个DataFrame的逗号分隔值列(忽略顺序)
解决方法
核心思路是把Items列的字符串转换成元素集合(集合不关心元素顺序,只关心元素是否存在),再比较集合是否相等。需要先统一处理不同的分隔符(逗号、空格):
步骤1:定义处理函数
先写一个函数,把任意分隔的字符串转成元素集合:
def str_to_set(s): # 把逗号替换成空格,统一分隔符 cleaned = s.replace(',', ' ') # 按空格分割,过滤空字符串(避免连续空格的情况) elements = [item.strip() for item in cleaned.split() if item.strip()] # 转成集合 return set(elements)
步骤2:处理两个DataFrame的Items列
用apply方法把函数应用到Items列,得到集合列:
import pandas as pd # 构造示例DataFrame df1 = pd.DataFrame({ 'Id': ['AQ', 'AT', 'AY'], 'Items': ['a,b,c', 'z,x,y', 'k,l,m'] }) df2 = pd.DataFrame({ 'Id': ['AQ', 'AT', 'AY'], 'Items': ['b,c a', 'z,y,x', 'k,l,m,n'] }) # 生成集合列 df1['items_set'] = df1['Items'].apply(str_to_set) df2['items_set'] = df2['Items'].apply(str_to_set)
步骤3:比较并生成结果
合并两个DataFrame的Id和items_set列,比较集合是否相等,最后整理成目标格式:
# 按Id合并,确保顺序一致 result = pd.merge(df1[['Id', 'items_set']], df2[['Id', 'items_set']], on='Id', suffixes=('_1', '_2')) # 比较集合是否相等 result['comparison_items'] = result['items_set_1'] == result['items_set_2'] # 保留需要的列 final_result = result[['Id', 'comparison_items']] print(final_result)
运行后输出:
Id comparison_items 0 AQ True 1 AT True 2 AY False
补充说明
如果你的Items列存在重复元素(比如a,a,b),且需要考虑重复次数,就不能用集合了,应该用排序后的列表来比较:
def str_to_sorted_list(s): cleaned = s.replace(',', ' ') elements = [item.strip() for item in cleaned.split() if item.strip()] return sorted(elements) # 后续比较逻辑同上,只是把集合换成排序后的列表
内容的提问来源于stack exchange,提问作者Ann Alexis
相关产品推荐
相关产品推荐

