Pandas/Numpy如何计算指定月份列落在[minSD,maxSD]区间内数值的平均值
Pandas 过滤行内区间值求平均实现方案
核心思路
先提取所有非固定字段的月度销量列,再逐行过滤落在[minSD, maxSD]区间内的销量值计算平均值,全程不硬编码月度列名,适配ERP导出列顺序变动的场景。
实现代码
第一步:提取月度销量列
通过排除已知固定列的方式筛选出所有月度销量列,不受列顺序、列名变化影响:
# 替换列表内的字段为你实际DataFrame里的非销量固定字段即可 month_sales_cols = [col for col in df.columns if col not in ['code', 'leadtime', 'mean', 'stddev', 'minSD', 'maxSD']]
第二步:计算avgwithSD列
方案1:行级apply(易理解,适合小数据量)
def calc_valid_avg(row): # 取当前行所有月度销量 sales_data = row[month_sales_cols] # 过滤符合区间条件的值 valid_data = sales_data[(sales_data >= row['minSD']) & (sales_data <= row['maxSD'])] # 返回平均值,无符合条件值时返回NaN,可按需用fillna替换为0等默认值 return valid_data.mean() df['avgwithSD'] = df.apply(calc_valid_avg, axis=1)
方案2:向量化运算(高性能,适合万行以上大数据量)
import numpy as np # 转成numpy数组做广播运算 sales_arr = df[month_sales_cols].values min_threshold = df['minSD'].values.reshape(-1, 1) max_threshold = df['maxSD'].values.reshape(-1, 1) # 生成符合条件的掩码,不符合的位置设为NaN valid_mask = (sales_arr >= min_threshold) & (sales_arr <= max_threshold) valid_sales = np.where(valid_mask, sales_arr, np.nan) # 按行求平均值,自动忽略NaN df['avgwithSD'] = np.nanmean(valid_sales, axis=1)
可选优化
如果存在无符合条件值的行,可按需填充默认值:
df['avgwithSD'] = df['avgwithSD'].fillna(0)
内容的提问来源于stack exchange,提问作者marcdb
相关产品推荐
相关产品推荐

