基于筛选条件删除重复originalIndex行的Pandas性能优化需求
Pandas高效处理重复组内保留最小差值行的优化方案
核心优化思路
放弃Python循环,利用Pandas的向量化运算和分组聚合能力——这类底层基于C实现的操作,速度远快于逐组的Python循环。
方案一:排序后分组取首行
先计算A与B的绝对值差,再按originalIndex分组,每组内按差值升序排序后取第一行:
# 计算差值列 df['Diff'] = abs(df['A'] - df['B']) # 按组排序并保留每组最小差值的行 result = df.sort_values(['originalIndex', 'Diff']).groupby('originalIndex').first().reset_index() # 移除临时差值列(可选) result = result.drop('Diff', axis=1)
方案二:用transform筛选最小差值行
通过transform获取每组的最小差值,直接筛选符合条件的行:
# 计算差值列 df['Diff'] = abs(df['A'] - df['B']) # 生成每组的最小差值映射 min_diff = df.groupby('originalIndex')['Diff'].transform('min') # 筛选出等于组内最小差值的行,若有重复仅保留第一个 result = df[df['Diff'] == min_diff].drop_duplicates('originalIndex') # 移除临时差值列(可选) result = result.drop('Diff', axis=1)
原循环方案的问题
原代码的性能瓶颈在于:
- 逐组切片生成临时DataFrame,频繁的内存操作拖慢速度
apply(lambda x: ...)是逐行的Python层面运算,效率远低于向量化计算- 数据量越大,循环的开销呈线性增长,性能瓶颈会愈发明显
注意事项
如果同一originalIndex组内存在多行差值相同且均为最小值的情况:
- 上述两种方案默认保留第一个出现的行
- 若需保留所有最小差值行,去掉
drop_duplicates('originalIndex')即可
内容的提问来源于stack exchange,提问作者Gozmit97
相关产品推荐
相关产品推荐

