如何在DataFrame中去重并保留columnE值为C的指定行
问题描述
现有如下DataFrame df:
columnA columnB columnC columnD columnE A B 10 C C A B 10 D A B C 20 A A B A 20 D A B A 20 D C
需求:当columnA、columnB、columnC三列组合存在重复条目时,仅保留其中columnE等于C的行;无重复的行直接保留。最终期望输出:
columnA columnB columnC columnD columnE A B 10 C C B C 20 A A B A 20 D C
实现方案
可以通过排序+去重的组合操作实现,两种写法供参考:
写法一:显式设置优先级列
import pandas as pd # 构造示例DataFrame data = { 'columnA': ['A', 'A', 'B', 'B', 'B'], 'columnB': ['B', 'B', 'C', 'A', 'A'], 'columnC': [10, 10, 20, 20, 20], 'columnD': ['C', 'D', 'A', 'D', 'D'], 'columnE': ['C', 'A', 'A', 'A', 'C'] } df = pd.DataFrame(data) # 给columnE=C的行设置更高优先级(数值越小越靠前) df['priority'] = df['columnE'].map({'C': 0, 'A': 1}) # 按目标列+优先级排序,让C行排在每组重复数据的最前面 df = df.sort_values(by=['columnA', 'columnB', 'columnC', 'priority']) # 去重,保留每组第一行(即优先级最高的C行),最后删除临时优先级列 df_result = df.drop_duplicates(subset=['columnA', 'columnB', 'columnC'], keep='first').drop(columns='priority') print(df_result)
写法二:简洁排序法(无需额外列)
import pandas as pd # 构造示例DataFrame data = { 'columnA': ['A', 'A', 'B', 'B', 'B'], 'columnB': ['B', 'B', 'C', 'A', 'A'], 'columnC': [10, 10, 20, 20, 20], 'columnD': ['C', 'D', 'A', 'D', 'D'], 'columnE': ['C', 'A', 'A', 'A', 'C'] } df = pd.DataFrame(data) # 按目标列排序,同时对columnE降序(C的字典序大于A,降序后C排在前面) # 然后去重保留每组第一行 df_result = df.sort_values(by=['columnA', 'columnB', 'columnC', 'columnE'], ascending=[True, True, True, False]) \ .drop_duplicates(subset=['columnA', 'columnB', 'columnC'], keep='first') print(df_result)
验证结果
两种写法输出的结果均与期望一致:
columnA columnB columnC columnD columnE 0 A B 10 C C 2 B C 20 A A 4 B A 20 D C
内容的提问来源于stack exchange,提问作者PV8
相关产品推荐
相关产品推荐

