如何在Pandas中按特定分组补全年份并填充缺失值?
问题:为Pandas DataFrame按分类组合补全年份记录并填充缺失值
原始DataFrame如下:
import pandas as pd df = pd.DataFrame({'Year': [2020, 2021, 2022, 2022, 2018, 2019, 2020, 2021], 'Cat1': ['level1', 'level1', 'level1', 'level1', 'level2', 'level2', 'level2', 'level2'], 'Cat2': ['sublevel1', 'sublevel1', 'sublevel1', 'sublevel1', 'sublevel2', 'sublevel2', 'sublevel2', 'sublevel2'], 'value': [1, 2, 3, 4, 5, 6, 7, 8]})
需求:提取Year列的所有唯一值,为每个Cat1与Cat2的有效组合补全这些年份记录,缺失的value值填充为0,同时保留原数据中Year重复的行(如2022年level1的两条记录)。
解决方案
以下是实现步骤及代码:
步骤1:提取核心要素
先获取所有唯一年份,以及原数据中实际存在的Cat1+Cat2组合(避免生成无关的交叉组合):
unique_years = df['Year'].unique() cat_pairs = df[['Cat1', 'Cat2']].drop_duplicates()
步骤2:生成完整的年份-分类模板
通过临时key的方式,让每个分类组合与所有唯一年份生成笛卡尔积,得到补全所需的基础框架:
# 给分类组合和年份添加临时key,用于生成笛卡尔积 full_template = cat_pairs.assign(key=1).merge( pd.DataFrame({'Year': unique_years, 'key': 1}), on='key' ).drop('key', axis=1)
步骤3:合并原数据并填充缺失值
用外连接将原数据合并到模板中,保留所有原数据行,缺失的value值填充为0:
result = full_template.merge( df, on=['Year', 'Cat1', 'Cat2'], how='outer' ).fillna({'value': 0}) # 按分类和年份排序,与示例结果对齐 result = result.sort_values(['Cat1', 'Cat2', 'Year']).reset_index(drop=True)
运行后得到的结果与需求一致:
Year Cat1 Cat2 value 0 2018 level1 sublevel1 0.0 1 2019 level1 sublevel1 0.0 2 2020 level1 sublevel1 1.0 3 2021 level1 sublevel1 2.0 4 2022 level1 sublevel1 3.0 5 2022 level1 sublevel1 4.0 6 2018 level2 sublevel2 5.0 7 2019 level2 sublevel2 6.0 8 2020 level2 sublevel2 7.0 9 2021 level2 sublevel2 8.0 10 2022 level2 sublevel2 0.0
关键说明
- 该方法保留了原数据中Year重复的行,因为外连接会完整保留原数据的所有记录。
- 通过
cat_pairs = df[['Cat1', 'Cat2']].drop_duplicates()确保只生成原数据中存在的分类组合,不会出现level1+sublevel2这类无效行。
内容的提问来源于stack exchange,提问作者jeeples
相关产品推荐
相关产品推荐

