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

Python中为缺失月份补行 按分区用最后值填充NULL

按ID补全缺失月份并填充最后有效值

问题描述

给定包含id、month、value列的DataFrame,需要:

  • 为每个id补全从其最早出现的月份到2023年4月的所有缺失月份行
  • 用该id的最后一个有效值向后填充value列的NULL值;若id的初始value即为NULL,则后续月份保持NULL

输入示例

import pandas as pd
import numpy as np

# 构造输入数据
df = pd.DataFrame({
    'id': [1,1,2,3,4],
    'month': ['2023-01-01', '2023-02-01', '2023-01-01', '2023-02-01', '2023-03-01'],
    'value': ['London', 'Paris', 'New York', 'Paris', np.nan]
})
# 转换日期类型
df['month'] = pd.to_datetime(df['month'])

解决方案代码

# 定义目标结束月份
end_month = pd.to_datetime('2023-04-01')

# 按id分组处理
result = df.groupby('id').apply(lambda x: 
    # 生成当前id的完整日期序列:从最早月份到end_month,按月
    x.set_index('month').reindex(pd.date_range(start=x['month'].min(), end=end_month, freq='MS'))
    # 重置索引,恢复month列
    .reset_index()
    # 向前填充value列的缺失值
    .ffill()
    # 保留id列(分组后id会变成索引,这里重置后需要重新赋值)
    .assign(id=x.name)
)[['id', 'month', 'value']]

# 重置结果的索引
result = result.reset_index(drop=True)

# 查看输出
print(result)

代码解释

  1. 日期类型转换:先将month列转为datetime类型,方便后续生成日期序列
  2. 分组处理:按id分组,对每个分组单独处理
  3. 生成完整日期序列:用pd.date_range生成从该id最早月份到2023-04-01的所有月初日期(freq='MS'表示每月第一天)
  4. 重新索引补全行:通过reindex补全缺失的月份行,此时缺失的value会变为NaN
  5. 向前填充:用ffill()方法填充value列,会自动延续最后一个有效值;如果分组的初始value就是NaN(如id=4),则填充后仍保持NaN
  6. 整理输出结构:重置索引并调整列顺序,确保输出格式与期望一致

输出结果

id      month     value
0    1 2023-01-01    London
1    1 2023-02-01     Paris
2    1 2023-03-01     Paris
3    1 2023-04-01     Paris
4    2 2023-01-01  New York
5    2 2023-02-01  New York
6    2 2023-03-01  New York
7    2 2023-04-01  New York
8    3 2023-02-01     Paris
9    3 2023-03-01     Paris
10   3 2023-04-01     Paris
11   4 2023-03-01       NaN
12   4 2023-04-01       NaN

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 09:52:37