如何在Python中为面板数据各组向后扩展5年时间序列
如何在Python中为每个公司分组扩展历史年份数据并填充NaN
我来帮你搞定这个需求——用Pandas就能高效实现,步骤清晰易懂,完全匹配你的预期输出。
先明确需求要点
- 按公司唯一标识(这里用
identifier最稳妥)分组 - 为每个分组找到最早的记录年份,向前生成5个连续年份的新行
- 新行复制
firm、sic、identifier、name的内容,X、Y、Z列填充为NaN - 最终合并原始数据与扩展数据,并按公司+年份排序
第一步:准备示例数据
先把你提供的原始数据转换成Pandas DataFrame:
import pandas as pd import numpy as np # 原始数据 raw_data = [ [1078, 2834.0, "002824100", "ABBOTT LABORATORIES", 2013, 4.347826, 5.217391, 15.739130], [1078, 2834.0, "002824100", "ABBOTT LABORATORIES", 2014, 4.368421, 6.263158, 16.684211], [112178, 2836.0, "00339B107", "ABGENIX INC", 2005, 5.222222, 3.111111, 9.777778], [112178, 2836.0, "00339B107", "ABGENIX INC", 2006, 5.222222, 4.111111, 10.777778], [178855, 2836.0, "00383Y102", "ABRAXIS BIOSCIENCE INC", 2007, 4.000000, 0.000000, 13.544322] ] df = pd.DataFrame(raw_data, columns=["firm", "sic", "identifier", "name", "year", "X", "Y", "Z"])
第二步:实现核心扩展逻辑
通过分组遍历生成扩展数据,再合并到原始数据中:
# 存储所有分组的扩展后数据 expanded_results = [] # 按公司唯一标识分组处理 for _, group in df.groupby("identifier"): # 获取当前公司的最早记录年份 earliest_year = group["year"].min() # 生成需要扩展的5个年份(最早年份往前推5年) expand_years = range(earliest_year - 5, earliest_year) # 构建扩展行的DataFrame expand_rows = pd.DataFrame({ "firm": [group["firm"].iloc[0]] * 5, "sic": [group["sic"].iloc[0]] * 5, "identifier": [group["identifier"].iloc[0]] * 5, "name": [group["name"].iloc[0]] * 5, "year": list(expand_years), "X": [np.nan] * 5, "Y": [np.nan] * 5, "Z": [np.nan] * 5 }) # 合并扩展行与原始分组数据,加入结果列表 expanded_group = pd.concat([expand_rows, group], ignore_index=True) expanded_results.append(expanded_group) # 合并所有分组结果,按公司和年份排序 final_df = pd.concat(expanded_results, ignore_index=True).sort_values(by=["identifier", "year"], ignore_index=True) # 查看最终结果 print(final_df)
额外:导出结果到CSV
如果需要把处理后的数据保存成文件,执行这行代码即可:
final_df.to_csv("expanded_company_data.csv", index=False)
运行后你会得到和你预期完全一致的输出——每个公司的原始数据前会多出5行历史年份的空值数据,静态列完全复制,整体按公司和年份有序排列。
内容的提问来源于stack exchange,提问作者Farid Mammadaliyev
相关产品推荐
相关产品推荐

