如何在pandas中按优先级规则删除ID字段重复的行数据
pandas按指定优先级按ID去重实现方案
核心思路
- 给每行按照规则计算优先级:同时存在Phone、Email有效值的行优先级最高,其余行优先级更低
- 按ID分组后,取每个分组内优先级最高的行即可
完整实现代码
如果你的数据里的null是字符串类型的'null',需要先替换为pandas识别的空值NaN,再进行计算:
import pandas as pd import numpy as np # 构造测试数据集,如果你是从csv读取直接用 pd.read_csv(你的文件路径) 即可 data = { 'ID': ['0001', '0001', '0001'], 'Phone': ['0234+', np.nan, '0234+'], 'Email': [np.nan, 'a@.com', 'a@.com'] } df = pd.DataFrame(data) # 如果你的数据中空值是字符串'null',先执行替换: # df = df.replace('null', np.nan) # 1. 新增优先级列:两个字段都非空的优先级为1,其余为2,数值越小优先级越高 df['priority'] = np.where(df['Phone'].notna() & df['Email'].notna(), 1, 2) # 2. 先按优先级升序排序,再按ID去重,保留每个ID的第一行 df_result = df.sort_values('priority').drop_duplicates('ID', keep='first').drop(columns='priority') print(df_result)
输出结果说明
运行上述代码后输出结果如下,会优先保留ID为0001的完整行:
ID Phone Email 2 0001 0234+ a@.com
特殊场景说明
- 如果同个ID下存在多行同时满足Phone和Email都非空,会默认保留排序后的第一行,如果你有其他额外优先级规则,可以在
sort_values里新增排序字段,比如df.sort_values(['priority', '其他字段']) - 如果同个ID下没有两个字段都非空的行,会自动保留优先级为2的任意一行,符合需求
内容的提问来源于stack exchange,提问作者Drsaud
相关产品推荐
相关产品推荐

