Pandas合并两表后快速计算同名字段偏差的最优方法
高效生成偏差列的实现方案(Pandas)
针对你的需求,避免使用apply循环,改用Pandas的向量化操作是最快的实现方式——向量化操作基于底层优化的numpy运算,完全绕开了Python层面的逐元素/逐行循环,数据量越大,效率优势越显著。
以下是两种高效的实现方式:
方式一:批量列运算(直观易读)
- 先提取所有以
_int结尾的列,得到基准指标名称:
import pandas as pd # 假设合并后的表名为df int_cols = [col for col in df.columns if col.endswith('_int')] base_measures = [col.replace('_int', '') for col in int_cols]
- 循环基准名称,直接计算对应
_int与_prod列的差值,生成偏差列:
for measure in base_measures: df[f'deviation_{measure}'] = df[f'{measure}_int'] - df[f'{measure}_prod']
方式二:批量过滤+合并(适合大量指标场景)
如果你的measure列数量很多,用过滤+重命名的方式批量生成偏差列更简洁:
# 分别提取_int和_prod列组,并重命名去掉后缀 int_group = df.filter(like='_int').rename(columns=lambda x: x[:-4]) # 移除"_int"后缀 prod_group = df.filter(like='_prod').rename(columns=lambda x: x[:-5]) # 移除"_prod"后缀 # 计算偏差并添加前缀 deviation_group = int_group - prod_group deviation_group = deviation_group.add_prefix('deviation_') # 将偏差列合并回原表 df = pd.concat([df, deviation_group], axis=1)
为什么这两种方法比apply快?
apply本质是在Python层面逐行/逐列执行自定义函数,存在大量Python循环开销;而上述两种方法都是基于Pandas的向量化列运算,底层由numpy的C代码实现,运算效率能提升数倍甚至数十倍(尤其是数据行数超过10万级时)。
内容的提问来源于stack exchange,提问作者Devarshi Goswami
相关产品推荐
相关产品推荐

