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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 02:01:40