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

百万行DataFrame中基于groupby高效填充缺失值的优化方案

高效填充分组内缺失的FDAT值

问题背景

我有一个百万行级别的DataFrame,包含ID、FDAT、LACT三列。同一ID下的同一LACT对应的FDAT值应完全一致,但存在少量FDAT缺失的情况,需要用该ID-LACT组内的有效FDAT值填充缺失项,且禁止修改非空的FDAT条目。

示例数据

ID  FDAT      LACT
1   1/1/2020    1
1   1/1/2020    1
1   1/1/2021    2
1   NA          2
1   1/1/2021    2
1   1/1/2022    3

示例中NA需填充为1/1/2021。

当前低效实现

目前使用以下代码处理,但运行速度极慢:

df.sort_values(["ID",'DATE'], inplace=True)

df.loc[:, 'FDAT'] = df.groupby(['ID','LACT']).fillna(method="ffill")
df.loc[:, 'FDAT'] = df.groupby(['ID','LACT']).fillna(method="bfill")

优化方案

由于同一ID-LACT组内的FDAT有效值完全一致,无需依赖行顺序做前后填充,直接取组内非空值填充即可,以下方案能大幅提升处理效率:

方案1:简洁的fillna+transform写法

# 仅填充FDAT的缺失项,保留原有非空值
df['FDAT'] = df['FDAT'].fillna(df.groupby(['ID', 'LACT'])['FDAT'].transform('first'))

方案2:显式处理组内缺失的写法

如果需要确保组内存在有效值才填充(避免组内全空时出错),可以用:

def fill_group_nulls(x):
    non_null = x.dropna()
    return x.fillna(non_null.iloc[0] if len(non_null) > 0 else x)

df['FDAT'] = df.groupby(['ID', 'LACT'])['FDAT'].transform(fill_group_nulls)

效率提升原因

  • 消除了原代码中冗余的排序操作(分组逻辑不需要依赖行顺序)
  • 仅执行一次分组计算,避免了两次groupby+fillna的重复开销
  • transform的向量化计算效率远高于逐组的前后填充逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 08:59:12