百万行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
相关产品推荐
相关产品推荐

