You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按Id分组,用上方3行均值填充Pandas DataFrame的NaN值?

解决方案:按分组用上方3行均值填充NaN

需求说明

给定Pandas DataFrame,需按Id列分组,将order_values列的NaN值替换为该位置上方3行数据的均值;若存在连续NaN,后续NaN需用上一个填充后的值参与计算(如示例中1002的第二个NaN,用填充后的33+18+36的均值替换)。

输入示例

import pandas as pd
import numpy as np

# 构造输入DataFrame
data = {
    'Id': [1002, 1002, 1002, 1002, 1002, 1002,
           1003, 1003, 1003, 1003, 1003,
           1004, 1004, 1004, 1004],
    'order_values': [45, 36, 18, np.nan, np.nan, 72,
                     68, 54, 45, np.nan, np.nan,
                     14, 50, 27, np.nan]
}
df = pd.DataFrame(data)

实现代码

def fill_nan_with_prev3_mean(series):
    filled = series.copy()
    for i in range(len(filled)):
        if pd.isna(filled[i]):
            # 取当前位置上方最多3行的数据
            prev3 = filled[max(0, i-3):i]
            # 计算均值并保留两位小数
            filled[i] = round(prev3.mean(), 2)
    return filled

# 按Id分组应用填充逻辑
df['order_values'] = df.groupby('Id')['order_values'].apply(fill_nan_with_prev3_mean)

输出结果

执行后得到的DataFrame与示例逻辑一致:

Idorder_values
100245.00
100236.00
100218.00
100233.00
100229.00
100272.00
100368.00
100354.00
100345.00
100355.67
100351.56
100414.00
100450.00
100427.00
100430.33

逻辑说明

  1. 自定义函数fill_nan_with_prev3_mean处理单个分组的order_values列:
    • 遍历每个元素,判断是否为NaN;
    • 若为NaN,截取当前位置上方最多3行的有效数据(包含已填充的前序NaN值);
    • 计算均值并保留两位小数,替换当前NaN。
  2. 通过groupby('Id')将数据按分组拆分,应用上述函数后合并结果。

内容的提问来源于stack exchange,提问作者s nandan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 18:54:39