如何删除DataFrame行最高值/绝对值最大值并计算剩余值均值
高效实现方案
两个场景核心逻辑一致:对每组5个待计算数值,按规则剔除1个极值后,对剩余4个值求均值。全部采用pandas向量化操作实现,比逐组循环的处理效率高1~2个数量级,适配大数据量场景。
首先导入依赖:
import pandas as pd
场景1:剔除组内最大值后求均值
计算规则:每组5个值中移除最大值(不关注最大值所在位置,仅保证最终保留4个值),对剩余值计算均值。
实现代码
# 原始示例数据 df1 = {"A":[78, 45, 50, 85, 63], "B":[52, 67, 81, 65, 83], "C":[67, 55, 81, 62, 58]} # 转换为行索引对应计算组、每行包含组内5个数值的结构 df1 = pd.DataFrame.from_dict(df1, orient="index") # 定位每行最大值的列位置(自动处理并列最大值,仅删除第一个出现的最大值) max_pos = df1.idxmax(axis=1) # 将对应最大值位置置为空值,pandas求均值时会自动跳过空值 df1.loc[df1.index, max_pos] = pd.NA # 按组计算剩余值的均值 res1 = df1.mean(axis=1)
结果验证
运行后输出结果完全匹配预期:
- A组结果为59.0
- B组结果为66.25
- C组结果为60.5
场景2:剔除组内绝对值最大的数后求均值
计算规则:每组5个值中移除绝对值最大的数(即与零偏差最大的值,保留原始正负符号计算剩余值均值)。
实现代码
# 原始示例数据 df2 = {"A":[-78, 45, -50, 85, -63], "B":[-52, 67, -81, 65, -83], "C":[67, -55, 81, -62, 58]} # 转换为行索引对应计算组的结构 df2 = pd.DataFrame.from_dict(df2, orient="index") # 计算每个值的绝对值,定位每行绝对值最大的位置 abs_max_pos = df2.abs().idxmax(axis=1) # 将对应位置置为空值 df2.loc[df2.index, abs_max_pos] = pd.NA # 按组计算剩余值的均值 res2 = df2.mean(axis=1)
结果验证
运行后输出结果完全匹配预期:
- A组结果为-36.5
- B组结果为-0.25
- C组结果为2.0
内容的提问来源于stack exchange,提问作者NienkeH
相关产品推荐
相关产品推荐

