如何用Python填补宽格式列结构时间序列中的数据缺口
宽格式时间序列数据填补缺口解决方案
针对你提出的宽格式时间序列数据填补需求(中间年份为0但前后连续两年为1时替换为1),可以直接在宽格式下通过Pandas实现,具体步骤如下:
实现步骤
- 分离年份列与标识列:提取所有年份相关的列,保留
Firm列作为企业标识。 - 遍历中间年份进行条件判断:对每个中间年份(排除首尾年份,因无对应前/后数据),检查每行是否满足「当前值为0且前后年份值均为1」的条件,满足则替换为1。
- 合并结果:将处理后的年份数据与原标识列合并,得到最终修正后的数据。
完整代码示例
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
相关产品推荐
相关产品推荐

