Pandas根据下方行的值删除行 如何用向量操作替代低效迭代方法
Pandas向量运算优化方案
完全可以通过Pandas内置的shift分组向量运算实现需求,彻底避免逐行迭代的性能损耗,优化后代码如下:
# 生成每个ID分组内当前行的下一行cond2值,分组最后一行的next_cond2为NaN df_more_records['next_cond2'] = df_more_records.groupby('ID')['cond2'].shift(-1) # 构造保留行的掩码:True为保留,False为删除,1:1匹配原逻辑 keep_mask = ( # 非分组末尾行:下一行cond2不等于'False'则保留 (df_more_records['next_cond2'].notna() & (df_more_records['next_cond2'] != 'False')) | # 分组末尾行:cond1和cond2都不等于'False'则保留 (df_more_records['next_cond2'].isna() & (df_more_records['cond1'] != 'False') & (df_more_records['cond2'] != 'False')) ) # 过滤后删除临时辅助列得到最终结果 df_grouped = df_more_records[keep_mask].drop(columns='next_cond2')
性能提升说明
- 所有运算均为Pandas底层C实现的向量化操作,无Python层循环,处理数万行数据效率相比原
iterrows实现提升至少100倍 - 取消了分组后应用带循环的自定义函数的逻辑,减少了分组
apply的额外开销
注意事项
如果你的数据中cond1、cond2存储的是布尔类型而非字符串'False',将代码中所有'False'替换为布尔值False即可。可以先使用小样本数据集验证输出结果和原实现完全一致后,再应用到全量数据集。
内容的提问来源于stack exchange,提问作者Jan Valušek
相关产品推荐
相关产品推荐

