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

Pandas按ID分组扩展DataFrame缺失日期并按规则填充Amount值

问题解决方案

实现思路

按ID分组后对每个分组单独处理,核心步骤如下:

  • 对每个ID取最早和最晚的记录,计算该分组需要补全的日期范围:最早记录所在月份的1日为起始,最晚记录所在月份的月末为结束
  • 生成连续单日日期序列,和原数据合并补全所有日期
  • 先填充首月早于首条记录的日期Amount为0,其余缺失值使用前向填充取最近的已有观测值

完整实现代码

import pandas as pd

# 示例数据初始化
df = pd.DataFrame({
    "ID":[1,1,1,2,2,2],
    "Date":["29.12.2020","05.01.2021","15.02.2021","11.04.2021","27.05.2021","29.05.2021"],
    "Amount":[6,5,7,9,8,7]
}) 
# 明确指定日期格式为日/月/年避免解析错误
df["Date"] = pd.to_datetime(df["Date"], dayfirst=True)

# 定义分组处理函数
def fill_id_group(group):
    first_rec = group.iloc[0]
    last_rec = group.iloc[-1]
    # 计算分组日期范围
    start_dt = first_rec['Date'].to_period('M').to_timestamp('D')
    end_dt = last_rec['Date'].to_period('M').to_timestamp(how='end').normalize()
    # 生成连续日期并重构索引
    full_dates = pd.date_range(start=start_dt, end=end_dt, freq='D')
    group = group.set_index('Date').reindex(full_dates).rename_axis('Date').reset_index()
    # 补全ID列
    group['ID'] = first_rec['ID']
    # 按规则填充Amount
    # 规则1:首月早于首条记录的日期填充0
    first_month = first_rec['Date'].to_period('M')
    group.loc[(group['Date'] < first_rec['Date']) & (group['Date'].dt.to_period('M') == first_month), 'Amount'] = 0
    # 其余缺失值前向填充
    group['Amount'] = group['Amount'].ffill().astype(int)
    return group

# 分组执行处理得到最终结果
result = df.groupby('ID', group_keys=False).apply(fill_id_group)

结果验证

你可以通过以下代码查看对应ID的补全结果:

# 查看ID=1的补全结果
print(result[result['ID']==1])
# 查看ID=2的补全结果
print(result[result['ID']==2])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 18:54:05