Pandas如何按convocation分组补全年份展开DataFrame行
Pandas按分组补全连续年份行方案
需求说明
处理包含Conv(convocation)、Year两列的DataFrame,规则如下:
- 按Conv字段分组,补全组内所有连续年份对应的行
- 仅处理Year列存在NA缺失的分组,已有完整年份数据的分组不做改动
- 不同Conv分组的年份区间无统一规律,需单独配置
样例数据
输入数据:
Conv Year 1 . # 代表NA缺失值 2 1991 2 1992 2 1993 2 1994
期望输出:
Conv Year 1 1985 1 1986 1 1987 2 1991 2 1992 2 1993 2 1994
实现代码
前置说明:由于缺失年份的分组无固定区间规则,需要提前配置好对应Conv的年份起止范围,无法从全为NA的分组中自动推导区间。
import pandas as pd import numpy as np # 1. 初始化示例数据 df = pd.DataFrame({ 'Conv': [1, 2, 2, 2, 2], 'Year': [np.nan, 1991, 1992, 1993, 1994] }) # 2. 配置存在年份缺失的Conv对应的[起始年, 结束年],按实际业务值修改 conv_missing_range = { 1: (1985, 1987) } # 3. 拆分出已有完整数据的部分 complete_part = df.dropna(subset=['Year']) # 4. 生成缺失分组的连续年份行 fill_part = [] for conv, (start, end) in conv_missing_range.items(): # 生成从起始年到结束年的所有连续年份,逐行写入 for year in range(start, end + 1): fill_part.append({"Conv": conv, "Year": year}) fill_part = pd.DataFrame(fill_part) # 5. 合并两部分数据,排序后重置索引 final_df = pd.concat([complete_part, fill_part], ignore_index=True) final_df = final_df.sort_values(by=["Conv", "Year"]).reset_index(drop=True)
执行后final_df即为期望结果。如果缺失分组的年份区间存在其他关联表可查,直接读取关联表生成conv_missing_range字典即可,无需硬编码。
内容的提问来源于stack exchange,提问作者nj95
相关产品推荐
相关产品推荐

