You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 18:27:02