pandas不完整数据高效行比较去重 优先保留完整行优化方案求助
Pandas 重复数据去重优化方案(优先保留date非空行)
核心思路
你的需求本质是同一重复分组内优先保留date字段非空的行,无符合行则保留rank=1的行,完全可以用pandas内置的排序+分组去重的向量化操作实现,不需要逐行迭代,性能提升非常明显。
具体实现代码
import pandas as pd def dedup_with_priority(df, duplicate_key_cols): """ 重复数据去重,优先保留date非空的行,次优先保留rank最小的行 参数: df: 原始待处理DataFrame duplicate_key_cols: 用于判断两行是否为重复数据的字段列表,比如['user_id', 'product_id'] 返回: 去重后的DataFrame """ # 构造辅助列标记date是否非空 df['date_valid'] = df['date'].notna() # 按规则排序:先按重复标识字段分组,组内优先date非空,再优先rank更小的行 sorted_df = df.sort_values( by = duplicate_key_cols + ['date_valid', 'rank'], ascending = [True]*len(duplicate_key_cols) + [False, True] ) # 按重复标识字段去重,保留排序后的第一条(最优行) result_df = sorted_df.drop_duplicates(subset=duplicate_key_cols, keep='first').copy() # 清理辅助列,重置索引 result_df.drop(columns=['date_valid'], inplace=True) result_df.reset_index(drop=True, inplace=True) return result_df
功能匹配说明
- 若同一个重复分组内存在date非空的行(不管rank是否为1),会被优先选中保留
- 若同一个重复分组内所有行date都为空,会自动保留rank=1的行
- 无重复的分组(组内仅一行),无论date是否为空都会正常留存,完全符合你的业务规则
性能对比
原生循环逻辑时间复杂度为O(n),但pandas迭代行的性能开销极高,上述向量化方案的底层是C实现,10万行级数据处理速度比循环快100倍以上。
内容的提问来源于stack exchange,提问作者Sofya Petrova
相关产品推荐
相关产品推荐

