在Pandas中计算每行最后n个非空列的行均值(无需硬编码列名)
Pandas实现每行最后2个非空列的均值计算
问题场景
现有如下Pandas DataFrame:
| id | jan | feb | mar | apr | may |
|---|---|---|---|---|---|
| 1 | 10 | 30 | |||
| 2 | 10 | 20 | 50 | 50 | 60 |
| 3 | 70 | 50 | |||
| 4 | 30 | 40 |
需要计算每行最后2个非空列的均值,新增average列,预期输出如下:
| id | jan | feb | mar | apr | may | average |
|---|---|---|---|---|---|---|
| 1 | 10 | 30 | 20 | |||
| 2 | 10 | 20 | 50 | 50 | 60 | 55 |
| 3 | 70 | 50 | 60 | |||
| 4 | 30 | 40 | 35 |
由于实际列数较多,无法硬编码列名,需要用动态方法实现。
实现代码
1. 构造示例数据
import pandas as pd import numpy as np df = pd.DataFrame({ 'id': [1,2,3,4], 'jan': [10,10,np.nan,np.nan], 'feb': [30,20,np.nan,30], 'mar': [np.nan,50,np.nan,40], 'apr': [np.nan,50,70,np.nan], 'may': [np.nan,60,50,np.nan] })
2. 动态计算每行最后2个非空值的均值
# 动态获取所有数值列(排除id列) num_columns = df.columns.drop('id') # 定义行处理函数:提取最后两个非空值并计算均值 def calc_last_two_mean(row): non_null_values = row.dropna().values # 取最后2个非空值,不足2个则取全部 target_values = non_null_values[-2:] if len(non_null_values) >= 2 else non_null_values return target_values.mean() # 应用函数到每行,生成average列 df['average'] = df[num_columns].apply(calc_last_two_mean, axis=1) # 输出结果 print(df)
代码说明
df.columns.drop('id'):无需硬编码列名,自动获取除id外的所有列,适配任意数量的数值列。apply(..., axis=1):按行遍历处理数据,确保每行单独计算。row.dropna():移除当前行的空值,再通过索引[-2:]取最后两个有效数值,兼容非空值不足2个的边界场景。
内容的提问来源于stack exchange,提问作者Chinthana
相关产品推荐
相关产品推荐

