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

如何合并DataFrame为各ID补全缺失月份并生成NaN条目?

解决方法

你的问题出在只基于Year_Month做左连接,没把ID的维度考虑进去——要实现每个ID对应所有月份的完整记录,得先生成所有ID与所有月份的笛卡尔积,再和原数据合并。

具体步骤如下:

1. 预处理时间格式

先把Year_Month转成datetime类型,方便生成连续月份:

import pandas as pd

# 转换时间列
df['Year_Month'] = pd.to_datetime(df['Year_Month'], format='%Y-%m')

2. 生成完整的ID和月份组合

  • 提取所有唯一ID
  • 确定数据中的最小和最大月份,生成该范围内的所有月份
  • 用pd.MultiIndex.from_product生成ID与月份的笛卡尔积,再转成DataFrame:
# 获取所有唯一ID
unique_ids = df['ID'].unique()

# 生成完整月份范围
min_month = df['Year_Month'].min()
max_month = df['Year_Month'].max()
all_months = pd.date_range(start=min_month, end=max_month, freq='MS')

# 生成ID+月份的全量组合
full_index = pd.MultiIndex.from_product([unique_ids, all_months], names=['ID', 'Year_Month'])
full_df = full_index.to_frame(index=False)

3. 左连接补全缺失值

把全量组合和原数据左连接,缺失的Count会自动填充为NaN:

# 合并数据
result_df = full_df.merge(df, on=['ID', 'Year_Month'], how='left')

# 可选:把Year_Month转回原字符串格式(如果需要)
result_df['Year_Month'] = result_df['Year_Month'].dt.strftime('%Y-%m')

为什么你的原方法无效?

你之前只生成了包含所有月份的df1,然后按Year_Month左连接,这只会把每个月份和原数据中该月份的所有ID记录合并,无法实现每个ID对应所有月份的补全逻辑——因为缺少了ID和月份的全量组合这一步。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 16:35:06