如何在Pandas DataFrame中向前填充库存编码对应年份至2022年
解决Pandas库存编码年份填充问题
需求说明
现有包含period(年份)和inventory code(库存编码)的DataFrame,需要为每个库存编码从其首次出现的起始年份开始,补充后续年份直到2022年,不回溯填充起始年份之前的年份(比如2019年出现的编码,不需要补2018年的行)。
实现步骤及代码
1. 准备测试数据
先还原示例数据:
import pandas as pd list_year = [2018, 2018, 2019, 2020, 2020, 2021, 2021, 2022] list_inv = ['TTO', 'TZA', 'OMN', 'RUS', 'SUR', 'TUR', 'USA', 'VAT'] df_test = pd.DataFrame({'period': list_year, 'inventory code': list_inv})
2. 提取每个库存编码的起始年份
通过分组聚合,找到每个编码首次出现的年份:
# 分组计算每个库存编码的最小年份(即起始年份) start_years = df_test.groupby('inventory code')['period'].min().reset_index()
3. 生成完整年份序列并展开
对每个编码,生成从起始年份到2022的年份列表,再通过explode将列表拆分为多行:
# 为每个编码生成从起始年到2022的年份序列 start_years['period'] = start_years.apply( lambda row: list(range(row['period'], 2023)), # 2023是开区间,最终会包含2022 axis=1 ) # 展开年份序列,整理得到最终结果 result_df = start_years.explode('period') \ .sort_values(['inventory code', 'period']) \ .reset_index(drop=True)
4. 验证结果
查看处理后的DataFrame,以OMN为例,它的起始年份是2019,结果中会包含2019-2022的所有年份,不会出现2018年的行,完全符合需求。
补充说明
如果目标年份不是固定2022,可以把代码中的2023替换为target_year + 1,让代码更灵活。比如目标年份是2025,就改成range(row['period'], 2026)。
内容的提问来源于stack exchange,提问作者user032020
相关产品推荐
相关产品推荐

