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

如何用Python填补宽格式列结构时间序列中的数据缺口

宽格式时间序列数据填补缺口解决方案

针对你提出的宽格式时间序列数据填补需求(中间年份为0但前后连续两年为1时替换为1),可以直接在宽格式下通过Pandas实现,具体步骤如下:

实现步骤

  1. 分离年份列与标识列:提取所有年份相关的列,保留Firm列作为企业标识。
  2. 遍历中间年份进行条件判断:对每个中间年份(排除首尾年份,因无对应前/后数据),检查每行是否满足「当前值为0且前后年份值均为1」的条件,满足则替换为1。
  3. 合并结果:将处理后的年份数据与原标识列合并,得到最终修正后的数据。

完整代码示例

import pandas as pd

# 原始数据
df = pd.DataFrame({
    'Firm': ['A', 'B', 'C', 'D', 'E', 'F'],
    '2003': [1, 1, 1, 0, 0, 1],
    '2004': [1, 0, 1, 0, 0, 1],
    '2005': [1, 1, 0, 0, 0, 0],
    '2006': [0, 1, 1, 0, 0, 1],
    '2007': [1, 0, 1, 1, 0, 1], 
    '2008': [1, 0, 1, 1, 0, 0]
})

# 复制原数据避免修改原始数据
df_filled = df.copy()
# 提取所有年份列(匹配4位数字列名)
year_cols = [col for col in df.columns if col.isdigit()]

# 遍历中间年份(从第2列到倒数第2列)
for idx in range(1, len(year_cols)-1):
    current_year = year_cols[idx]
    prev_year = year_cols[idx-1]
    next_year = year_cols[idx+1]
    
    # 生成满足条件的掩码:当前值为0,前后均为1
    fill_mask = (df_filled[current_year] == 0) & \
                (df_filled[prev_year] == 1) & \
                (df_filled[next_year] == 1)
    
    # 对满足条件的行进行填补
    df_filled.loc[fill_mask, current_year] = 1

# 输出结果
print(df_filled)

验证结果

运行上述代码后,输出结果与你期望的完全一致:

Firm  2003  2004  2005  2006  2007  2008
0    A     1     1     1     1     1     1
1    B     1     1     1     1     0     0
2    C     1     1     1     1     1     1
3    D     0     0     0     0     1     1
4    E     0     0     0     0     0     0
5    F     1     1     1     1     1     0

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 05:52:56