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

如何以向量化方式处理百万行DataFrame,删除重复th值对应的极值行以保持0/1交替

如何以向量化方式处理百万行DataFrame,删除重复th值对应的极值行以保持0/1交替

嘿,针对你百万行DataFrame的这个需求,我给你一套高效的向量化解决方案,完全不用循环,速度拉满:

首先咱们得把需求拆解清楚:要让th列严格保持0/1交替,遇到连续相同的th值组时:

  • 连续0的组:删掉组内N最小的行,只留N最大的那一行
  • 连续1的组:删掉组内N最大的行,只留N最小的那一行

具体实现步骤

  1. 标记连续相同th的分组
    我们先给每一段连续相同的th值打上分组ID,这样就能把连续的0或1归为一组:

    import pandas as pd
    
    # 假设你的原始数据存在df里
    df['group_id'] = df['th'].ne(df['th'].shift()).cumsum()
    

    这个操作是向量化的,ne是判断当前行和上一行的th是否不同,cumsum把连续相同的行归为同一个分组ID。

  2. 按分组筛选要保留的行
    接下来我们分两组处理:

    • 对所有th=1的分组,保留组内N最小的行(也就是删掉最大的)
    • 对所有th=0的分组,保留组内N最大的行(也就是删掉最小的)
      代码如下:
    # 先获取每个分组对应的th值
    group_th = df.groupby('group_id')['th'].first()
    
    # 分离出th=1和th=0的分组ID
    groups_1 = group_th[group_th == 1].index
    groups_0 = group_th[group_th == 0].index
    
    # 筛选th=1分组中N最小的行的索引
    keep_idx_1 = df[df['group_id'].isin(groups_1)].groupby('group_id')['N'].idxmin()
    # 筛选th=0分组中N最大的行的索引
    keep_idx_0 = df[df['group_id'].isin(groups_0)].groupby('group_id')['N'].idxmax()
    
    # 合并索引并按原顺序排序
    keep_idx = pd.concat([keep_idx_1, keep_idx_0]).sort_index()
    
    # 得到最终结果
    result_df = df.loc[keep_idx].drop(columns='group_id')
    

为什么这个方法快?

所有用到的groupby、idxmin、idxmax都是pandas底层优化的向量化操作,完全避开了逐行循环,处理百万级数据的速度会非常可观。而且整个逻辑完全贴合你的需求,处理后的th列会严格保持0/1交替的节奏。

你可以直接把这段代码套用到你的数据上,应该就能得到你想要的结果啦。

备注:内容来源于stack exchange,提问作者Andy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.16 10:32:58