Pandas如何忽略非数值列 计算每行前n个最大值的平均值生成新列
Pandas逐行提取前N个最大值计算平均值实现方案
核心实现逻辑
- 自动识别DataFrame中所有数值类型列,无需手动排除
time这类非数值字段 - 逐行对数值做排序,提取指定数量的最大数值
- 计算提取出的数值的平均值,存入独立新列
测试数据构建
直接运行下方代码即可生成示例用的测试DataFrame:
import pandas as pd import numpy as np time = ['11:50', '12:50', '13:50'] data_1 = {'time': time, 'n1': [1, 5, 8], 'n2': [2, 6 ,7], 'n3': [3, 7 ,6], 'n4': [4, 8, 5], } df1 = pd.DataFrame(data = data_1)
核心计算代码
以提取每行最大2个数值、计算平均值存入Average_largest_2_column列为例,代码如下:
# 配置需要提取的最大值个数,修改该值即可适配不同需求 top_n = 2 # 自动筛选所有数值类型列,自动跳过非数值字段 numeric_columns = df1.select_dtypes(include=np.number).columns # 逐行计算前top_n个最大值的平均值,赋值到新列 df1['Average_largest_2_column'] = df1[numeric_columns].apply( lambda x: x.nlargest(top_n).mean(), axis=1 )
运行效果
运行后输出的DataFrame效果如下,和预期完全一致:
| time | n1 | n2 | n3 | n4 | Average_largest_2_column |
|---|---|---|---|---|---|
| 11:50 | 1 | 2 | 3 | 4 | 3.5 |
| 12:50 | 5 | 6 | 7 | 8 | 7.5 |
| 13:50 | 8 | 7 | 6 | 5 | 7.5 |
说明:如果需要计算前3、前4个最大值的平均,只需要修改
top_n的赋值即可,代码会自动适配,无需调整其他逻辑。
内容的提问来源于stack exchange,提问作者n3a5p7s9t1e3r
相关产品推荐
相关产品推荐

