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

如何在Python Pandas中沿axis=1剔除行内异常值并计算均值?

解决每行剔除分位异常值后计算均值的问题

步骤说明

要实现每行剔除2.5%和97.5%分位数之外的数据,再计算行均值,你可以按以下步骤操作:

  • 先计算每行的两个分位数值,转置后让分位数与原DataFrame的行对齐
  • 生成布尔掩码标记超出分位范围的数据
  • 将超出范围的数据替换为NaN,再用mean(axis=1)计算均值(Pandas计算均值时会自动忽略NaN)

完整代码示例

首先修正测试数据的导入问题,再实现核心逻辑:

import numpy as np
import pandas as pd

# 生成测试数据
cols = np.random.rand(10, 2000)
df = pd.DataFrame(cols)

# 计算每行的2.5%和97.5%分位数,转置后行对齐
quantiles = df.quantile([0.025, 0.975], axis=1).T
quantiles.columns = ['q_low', 'q_high']

# 生成掩码:标记每行中低于q_low或高于q_high的值
mask = (df < quantiles['q_low'].values[:, None]) | (df > quantiles['q_high'].values[:, None])

# 将异常值替换为NaN,然后计算行均值
df_filtered = df.mask(mask)
row_means = df_filtered.mean(axis=1)

# 查看结果
print(row_means)

代码解释

  • df.quantile([0.025, 0.975], axis=1).T:原quantile方法返回的是分位数为行、原DataFrame行为列的结果,转置后让每个产品(行)对应自己的两个分位数
  • 掩码生成利用了广播机制:quantiles['q_low'].values[:, None]将一维数组转为二维列数组,和原DataFrame逐元素比较,实现每行的范围判断
  • df.mask(mask)会把掩码为True的位置替换为NaN,后续mean计算自动忽略这些值,得到剔除异常值后的行均值

内容的提问来源于stack exchange,提问作者Jordan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 09:30:51