如何为pandas DataFrame补全缺失月份以计算每月预测人口
无需新增临时列的实现方案
以下几种方法都不需要提前在原数据集上新增持久化的临时列,实现逻辑更简洁,部分方案针对同一年slope、intercept一致的特征做了性能优化:
方案1:一行代码快速实现
适合小数据集,直接通过临时赋值+列展开+去重完成补全:
df = df.assign(month=[range(1,13)]).explode('month').drop_duplicates(["Year", "month"]).reset_index(drop=True)
逻辑说明:
- 用
assign生成临时的列表格式month列,不会在原数据集上新增多余列 explode将列表拆分为12行,对应1-12月- 按年+月去重得到唯一的年月组合
- 后续可直接运行你原有
pred_pop的计算逻辑
方案2:年参数提取优化(更适合大数据集)
因为同一年的slope、intercept全局一致,先提取年维度的参数映射表再补全月份,避免重复计算:
# 提取每年的固定参数,去重减少后续计算量 year_params = df[["Year", "slope", "intercept"]].drop_duplicates() # 给每一年补全1-12月,直接得到完整的年月参数表 df_full = year_params.assign(month=[range(1,13)]).explode("month").reset_index(drop=True)
如果需要保留原有月份的实际pop值,额外补充一步合并即可:
df_full = df_full.merge(df[["Year", "month", "pop"]], on=["Year", "month"], how="left")
方案3:用MultiIndex生成完整索引
通过笛卡尔积生成所有年月组合,再匹配参数:
import pandas as pd # 生成所有年+12个月的完整索引 full_index = pd.MultiIndex.from_product( [df["Year"].unique(), range(1,13)], names=["Year", "month"] ) # 匹配每年的参数得到完整表 df_full = ( df[["Year", "slope", "intercept"]] .drop_duplicates() .set_index("Year") .reindex(full_index.get_level_values("Year")) .reset_index() .assign(month=full_index.get_level_values("month")) )
内容的提问来源于stack exchange,提问作者magladde
相关产品推荐
相关产品推荐

