如何用Pandas指令替代循环,基于IC列条件计算DataFrame的PromP值?
高效计算PromP列的Pandas方案
核心思路
用Pandas的向量化操作替代嵌套循环,通过条件掩码筛选符合要求的月度数据,再逐行计算平均值,彻底规避循环带来的性能损耗。
实现代码
假设你的DataFrame中,2021年1-12月的列名为2021_1到2021_12,执行以下代码:
import numpy as np import pandas as pd # 1. 定义2021年月度数据列 monthly_cols = [f'2021_{i}' for i in range(1, 13)] # 2. 创建条件掩码:根据IC列筛选对应月度值 # IC为G时,保留大于Promedio的月度值;IC为L时,保留小于Promedio的月度值 mask = np.where( df['IC'] == 'G', df[monthly_cols] > df['Promedio'].values[:, None], # 广播平均值到月度列维度 df[monthly_cols] < df['Promedio'].values[:, None] ) # 3. 计算PromP:对每行符合条件的月度值取平均 df['PromP'] = df[monthly_cols].where(mask).mean(axis=1)
关键说明
- 向量化优势:
np.where和df.where都是底层优化的向量运算,比Python循环快数倍,适配大规模数据集。 - 维度对齐:
df['Promedio'].values[:, None]将一维平均值列转为二维数组,实现和月度列的逐元素比较。 - 空值自动处理:
where会把不符合条件的值设为NaN,mean(axis=1)自动忽略空值,正好匹配“只计算符合条件月度数据”的需求。 - 灵活调整:若需要包含等于平均值的情况,将代码中的
>改为>=、<改为<=即可。
内容的提问来源于stack exchange,提问作者matdlara
相关产品推荐
相关产品推荐

