You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 22:27:04