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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 13:15:39