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

如何为DataFrame补全各ID对应的缺失月份?

解决方案

要实现每个ID包含所有SentMonth且缺失Amount填充0的需求,可以通过构建完整的ID-月份笛卡尔积来解决,具体步骤如下:

步骤1:提取唯一的ID和月份

先从原数据中获取所有不重复的ID和SentMonth值,用于生成完整的组合框架:

unique_ids = df['ID'].unique()
unique_months = df['SentMonth'].unique()

步骤2:生成ID与月份的笛卡尔积

利用itertools.product生成所有ID和月份的组合,确保每个ID都能覆盖所有存在的月份:

from itertools import product

# 生成完整的ID-月份组合
full_index = pd.DataFrame(product(unique_ids, unique_months), columns=['ID', 'SentMonth'])

步骤3:聚合原数据的Amount值

对原数据按ID和SentMonth分组,聚合同一ID同一月份的Amount(这里用sum,可根据需求调整):

# 聚合每个ID每月的Amount总和
agg_df = df.groupby(['ID', 'SentMonth'], as_index=False)['Amount'].sum()

步骤4:合并并填充缺失值

将完整的ID-月份框架与聚合后的数据合并,缺失的Amount填充为0,同时补充每个ID的固定属性(如Tranche、Totals、Opened):

# 合并并填充Amount的缺失值为0
result = full_index.merge(agg_df, on=['ID', 'SentMonth'], how='left').fillna({'Amount': 0})

# 提取每个ID的固定属性(Tranche、Totals、Opened)
id_metadata = df.groupby('ID').agg({
    'Tranche': 'first',
    'Totals': 'first',
    'Opened': 'first'
}).reset_index()

# 合并补充固定属性
result = result.merge(id_metadata, on='ID', how='left')

验证效果

处理后的result数据中,每个ID都会包含所有SentMonth的记录,无对应数据的Amount为0,后续可直接对Amount执行cumsum()操作:

# 按ID分组计算累计和
result['CumulativeAmount'] = result.groupby('ID')['Amount'].cumsum()

为什么这个方法可行?

  • 避开了重索引时重复值的问题,直接通过笛卡尔积构建完整的记录框架
  • 不需要依赖时间索引的resample,避免了索引类型错误
  • 保留了每个ID的固定属性,确保数据完整性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 18:45:46