如何在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
相关产品推荐
相关产品推荐

