如何为DataFrame新增行:固定id列值并为year列补充多年份记录
解决方案
实现该需求不需要用apply(apply本身不擅长做变更DataFrame行数的操作,很容易出现索引对齐、返回值长度不匹配的报错),以下两种方法可以直接复用:
方法1:全量组合生成(仅含id、year两列时最高效)
如果你的DataFrame只有id、year两列,直接生成所有id和目标年份的笛卡尔积即可,执行效率远高于循环或apply:
import pandas as pd # 第一步:构造/读取你的原始数据(示例) df = pd.DataFrame({ 'id': [f'{i:02d}' for i in range(1, 100)], # 01-99的字符串格式id 'year': 2022 }) # 第二步:生成所有id与[2022,2023,2024]的全配对 target_years = [2022, 2023, 2024] full_df = pd.MultiIndex.from_product( [df['id'].unique(), target_years], names=['id', 'year'] ).to_frame(index=False) # 第三步:按id、year排序整理结果 full_df = full_df.sort_values(by=['id', 'year']).reset_index(drop=True)
方法2:批量追加新行(适合原表有其他业务列的场景)
如果你的原始DataFrame除了id、year还有其他业务字段,需要保留2022年已有的字段值,新增年份的行可以后续再填充其他字段,用批量追加的方式实现:
# 取出所有唯一id,保留原id的格式(不会丢失01这类前面补0的字符串格式) unique_ids = df['id'].unique() # 遍历需要新增的年份,批量生成新行后拼接 for year in [2023, 2024]: add_rows = pd.DataFrame({ 'id': unique_ids, 'year': year }) df = pd.concat([df, add_rows], ignore_index=True) # 排序整理结果 df = df.sort_values(by=['id', 'year']).reset_index(drop=True)
结果校验
执行完后可以用以下代码确认结果符合预期:
# 校验每个id对应的年份数是否为3 print(df.groupby('id')['year'].count().unique()) # 输出[3]即为正确 # 抽样查看单个id的结果 print(df[df['id'] == '01']) # 预期输出3行,对应year值分别为2022、2023、2024
注意:如果你的
id是需要保留前导0的字符串格式(比如01、02),不要在处理过程中把id转成整数类型,否则会丢失前导0变成1、2,不符合格式要求。
内容的提问来源于stack exchange,提问作者futur3boy
相关产品推荐
相关产品推荐

