Pandas中替代逐行apply、按分组为DataFrame新增极差列的高效方法
高效实现方案
完全可以用Pandas向量化分组计算替代逐行apply的低效逻辑,在结果完全匹配预期的前提下,实现数量级的性能提升。
核心实现
核心逻辑是通过一次分组遍历统计每个组的Score极差,再把统计结果广播回组内的每一行,不需要逐行全表筛选匹配:
# 分组计算组内Score极差,直接生成新列 df['Score Range'] = df.groupby('Group Index')['Score'].transform( lambda s: np.ptp(s) # 和原实现的极差计算逻辑完全等价 )
运行后得到的结果和原实现完全一致:
X Group Index Score Score Range 0 1.1 1 1 2 1 1.2 1 2 2 2 1.3 1 3 2 3 2.1 2 10 20 4 2.2 2 20 20 5 2.3 2 30 20
极致性能优化版本
如果处理的数据量达到百万行以上,可以进一步去掉Python层的lambda调用开销,直接调用Pandas内置的C级聚合方法计算,性能会再上一个台阶:
# 预生成分组对象,分别计算组内max和min,直接相减得到极差 grouped_score = df.groupby('Group Index')['Score'] df['Score Range'] = grouped_score.transform('max') - grouped_score.transform('min')
原实现性能偏低的原因
- 原逐行apply的逻辑,每处理一行就会对全表做一次条件过滤、筛选同组数据、计算极差,整体时间复杂度为O(N²)
- 分组transform的实现仅需一次全表遍历完成所有组的统计,整体时间复杂度为O(N),数据量越大,性能优势越明显
内容的提问来源于stack exchange,提问作者user3556304
相关产品推荐
相关产品推荐

