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

Pandas非平衡面板数据:同观测单元跨期值填充location缺失值

面板数据同观测单元location缺失值填充方案

核心需求:按id匹配同一观测单元,用该单元其他时间周期的有效location值填充缺失项,不改动其余字段的原有取值,兼容按时间排序的非平衡面板结构。


方案1:固定属性填充(推荐,适合同一单元location不随时间变化的场景)

绝大多数面板数据中,观测单元的地理位置属于不随时间变动的固定属性,仅存在录入缺失,该方案效率最高,不依赖数据排序,直接兼容非平衡面板:

import pandas as pd
import numpy as np

# 示例数据构造(和提供的代码逻辑一致)
dates = 3 * list(pd.date_range(start='1/31/2018', end='3/31/2018', freq="M"))
unit_id = ["id_1", "id_1", "id_1", "id_2", "id_2", "id_2", "id_3", "id_3", "id_3"]
locations = ["loc_1", "loc_1", np.nan, "loc_2", "loc_2", np.nan, "loc_3", "loc_3", np.nan]
var_1 = ["x1_t1", "x1_t2", "x1_t3", "x2_t1", "x2_t2", "x2_t3", "x3_t1", "x3_t2", "x3_t3"]
var_2 = ["z1_t1", "z1_t2", "z1_t3", "z2_t1", "z2_t2", "z2_t3", "z3_t1", "z3_t2", "z3_t3"]
df = pd.DataFrame({"date": dates, "id": unit_id, "location": locations, "var_1": var_1, "var_2": var_2})

# 核心填充逻辑
df["location"] = df.groupby("id")["location"].transform(
    lambda x: x.dropna().iloc[0] if len(x.dropna()) > 0 else np.nan
)

逻辑说明:按id分组后,提取每个分组内第一个非空的location值填充该组所有缺失行;如果某id全量记录都没有location有效值,则保留NaN,不会生成错误填充值。


方案2:时间顺序填充(适合同一单元location可能随时间变动的场景)

如果观测单元的location存在跨时间周期的变更,需要按时间先后顺序用相邻周期的有效值填充,先按id+date排序保证时间顺序正确后,执行双向填充即可:

# 先按观测单元、时间维度排序,兼容任意原始排序的数据集
df = df.sort_values(by=["id", "date"]).reset_index(drop=True)

# 分组后先向前填充(用更早时间点的有效值补后续缺失),再向后填充(补时间序列最前端的缺失)
df["location"] = df.groupby("id")["location"].ffill().bfill()

逻辑说明:该方案严格遵循时间顺序填充,location发生变更后出现的缺失会自动使用新位置值填充,变更前的缺失使用旧值填充,符合时间序列数据的业务逻辑。


注意事项

  • 两种方案都仅修改location字段,其余字段的取值完全不受影响;方案2排序后如果需要保留原始行顺序,可以提前加行号列排序后还原
  • 非平衡面板场景下无需提前补全缺失时间点,分组逻辑会自动适配每个id的实际观测周期
  • 对全量记录均无location有效值的id,两种方案都会保留NaN,不会强行填充无效值

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 15:30:54