Python中基于多列及特定条件去除重复行的实现方法
问题:移除DataFrame中互为交换的重复行
原始DataFrame
CUI1 CUI2 RELA SL CUI_x SAB_x CODE_x STR_x TTY_x CUI_y SAB_y CODE_y STR_y TTY_y C0010356 C0205721 same_as SNOMEDCT_US C0010356 MDR 10011409 Cross infection PT C0205721 MDR 10029803 Nosocomial infection PT C0205721 C0010356 same_as SNOMEDCT_US C0205721 MDR 10029803 Nosocomial infection PT C0010356 MDR 10011409 Cross infection PT C0010356 C0205721 same_as SNOMEDCT_US C0010356 MDR 10011409 Cross infection LLT C0205721 MDR 10029803 Nosocomial infection PT C0205721 C0010356 same_as SNOMEDCT_US C0205721 MDR 10029803 Nosocomial infection PT C0010356 MDR 10011409 Cross infection LLT
需求说明
当多行满足以下两个条件时,仅保留其中一行:
- 具有相同的
TTY_x和TTY_y层级 CODE_x与CODE_y的值互为交换(即A行的CODE_x是B行的CODE_y,A行的CODE_y是B行的CODE_x)
期望输出
CUI1 CUI2 RELA SL CUI_x SAB_x CODE_x STR_x TTY_x CUI_y SAB_y CODE_y STR_y TTY_y C0010356 C0205721 same_as SNOMEDCT_US C0010356 MDR 10011409 Cross infection PT C0205721 MDR 10029803 Nosocomial infection PT C0205721 C0010356 same_as SNOMEDCT_US C0205721 MDR 10029803 Nosocomial infection PT C0010356 MDR 10011409 Cross infection LLT
解决方案(Pandas实现)
核心思路是为每组互为交换的行生成唯一标识,再基于标识去重:
import pandas as pd # 假设原始数据已加载为DataFrame df # df = pd.read_csv(...) # 生成分组键:结合TTY层级+排序后的CODE组合,确保交换CODE的行拥有相同键 df['group_key'] = df.apply( lambda row: (row['TTY_x'], row['TTY_y'], tuple(sorted([row['CODE_x'], row['CODE_y']]))), axis=1 ) # 按分组键去重,保留每组第一行,最后删除辅助列 result_df = df.drop_duplicates(subset='group_key', keep='first').drop(columns='group_key') # 输出结果 print(result_df)
代码解释
tuple(sorted([row['CODE_x'], row['CODE_y']])):将每行的两个CODE排序后转为元组,让交换CODE的行得到相同的标识- 把
TTY_x、TTY_y和排序后的CODE元组组合成group_key,确保只有相同层级且CODE互为交换的行才会被归为同一组 drop_duplicates保留每组第一行,最后删除辅助列得到最终结果
内容的提问来源于stack exchange,提问作者rshar
相关产品推荐
相关产品推荐

