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

如何替换面板数据缺失值?用疫情前收入填充疫情后缺失值的代码实现

同个体历史值匹配填充面板缺失值实现方案

你的填充逻辑属于面板数据中基于个体自身历史观测的冷填充,不需要复杂模型拟合,按个体ID做分组匹配即可,下面提供两种量化研究最常用工具的可直接运行代码:

Python(pandas)实现

  • 提前确认数据集必备字段:唯一个体ID、周收入、疫情阶段标签(取值区分疫情前/疫情后即可,比如pre/post)、观测周次(可选,如果你需要取特定时间点的历史收入)
  • 填充基准可根据研究需求选择:疫情前多周平均收入、疫情前最后一周收入、疫情前收入中位数都可,示例默认用疫情前平均周收入做填充值
import pandas as pd

# 若你已经拆分了两个独立子集,直接从疫情前子集计算个体收入基准即可
# 未拆分的全量数据集用下面这行计算基准
pre_income_ref = (
    df.query("疫情阶段 == 'pre'")
    .groupby("个体ID", as_index=False)["周收入"]
    .mean() # 要替换为疫情前最后一期收入,把.mean()改成.last()即可
    .rename(columns={"周收入": "个体_pre收入基准"})
)

# 把基准值匹配合并到原数据集
df = df.merge(pre_income_ref, on="个体ID", how="left")

# 核心规则:仅替换疫情后观测周期内的收入缺失值,疫情前本身的缺失值不做改动
df.loc[(df["疫情阶段"] == "post") & (df["周收入"].isna()), "周收入"] = df["个体_pre收入基准"]

# 清理临时字段
df.drop(columns="个体_pre收入基准", inplace=True)

注意:如果部分个体疫情前完全没有收入观测,填充后对应位置会保留空值,这类样本可以根据你的研究规则单独剔除或做其他处理。

Stata实现

做微观面板常用的Stata实现代码更简洁,逻辑和pandas版本完全一致:

* 按个体分组,计算每个个体疫情前的平均周收入作为填充基准
bysort 个体ID: egen pre_inc_ref = mean(cond(疫情阶段 == "pre", 周收入, .))

* 仅替换疫情后周期的收入缺失值
replace 周收入 = pre_inc_ref if 疫情阶段 == "post" & missing(周收入)

* 清理临时生成的基准变量
drop pre_inc_ref

如果需要用疫情前最后一期收入做填充,把计算基准的代码替换为以下内容即可:

* 按个体和周次排序,标记疫情前的收入观测
gsort 个体ID -观测周次
bysort 个体ID: gen pre_last_inc = 周收入 if 疫情阶段 == "pre"
* 取每个个体排序后第一个非空的疫情前收入(也就是最近一期的疫情前收入)
bysort 个体ID: replace pre_last_inc = pre_last_inc[_n-1] if missing(pre_last_inc)
* 后续替换逻辑和之前一致
replace 周收入 = pre_last_inc if 疫情阶段 == "post" & missing(周收入)
drop pre_last_inc

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 20:31:03