如何按含大量NaN的列分组求均值且不扭曲原有数据集
实现方法
核心逻辑为:每一个column_1的非NaN值对应一个分组,范围包含该非NaN值所在行,以及后续所有连续NaN值的行,直到遇到下一个column_1的非NaN值为止,基于该逻辑使用Pandas实现的代码如下:
import pandas as pd import numpy as np # 构造输入数据集(实际使用时替换为自己的数据集即可) df = pd.DataFrame({ 'column_1': [45.0, np.nan, np.nan, 37.0, np.nan, np.nan, np.nan, 45.0, np.nan, np.nan], 'column_2': [3,4,7,1,6,2,4,2,1,3], 'column_3': [2,6,2,1,4,7,5,2,1,3] }) # 生成分组标识:每遇到非NaN的column_1值,分组标识自动累加1 df['group_id'] = df['column_1'].notna().cumsum() # 按分组聚合:column_1取组内第一个有效值,其余列取均值 result = df.groupby('group_id').agg( column_1 = ('column_1', 'first'), column_2 = ('column_2', 'mean'), column_3 = ('column_3', 'mean') ).reset_index(drop=True) # 按需调整小数保留位数,和示例输出一致可保留2位小数 result = result.round({'column_2': 2, 'column_3': 2})
逻辑说明
df['column_1'].notna()会返回布尔序列,非空行对应True(数值等价为1),空行对应False(数值等价为0)- 对布尔序列执行
cumsum()累加后,连续空行和上方第一个非空行的累加值完全相同,自动形成符合需求的分组 - 聚合时
column_1直接取组内第一个非空值即可,其余数值列按需求计算均值
内容的提问来源于stack exchange,提问作者bassline_ballerina
相关产品推荐
相关产品推荐

