如何以向量化方式处理百万行DataFrame,删除重复th值对应的极值行以保持0/1交替
如何以向量化方式处理百万行DataFrame,删除重复th值对应的极值行以保持0/1交替
嘿,针对你百万行DataFrame的这个需求,我给你一套高效的向量化解决方案,完全不用循环,速度拉满:
首先咱们得把需求拆解清楚:要让th列严格保持0/1交替,遇到连续相同的th值组时:
- 连续0的组:删掉组内
N最小的行,只留N最大的那一行 - 连续1的组:删掉组内
N最大的行,只留N最小的那一行
具体实现步骤
标记连续相同
th的分组
我们先给每一段连续相同的th值打上分组ID,这样就能把连续的0或1归为一组:import pandas as pd # 假设你的原始数据存在df里 df['group_id'] = df['th'].ne(df['th'].shift()).cumsum()这个操作是向量化的,
ne是判断当前行和上一行的th是否不同,cumsum把连续相同的行归为同一个分组ID。按分组筛选要保留的行
接下来我们分两组处理:- 对所有
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
相关产品推荐
相关产品推荐

