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

按ID重复DataFrame行 逐年更新year和age直至满足指定条件

问题描述

我找不到该问题的解决方案,不清楚最优实现方式。现有如下测试DataFrame:

IDyearagedeath
11999182015
2198425
3201224

需求为:按ID重复每行数据,year和age逐年加1,直至满足以下任一条件:

year == 2018 or year == death

最终生成的DataFrame如下:

IDyearagedeath
11999182015
12000192015
12001202015
12002212015
12003222015
12004232015
12005242015
12006252015
12007262015
12008272015
12009282015
12010292015
12011302015
12012312015
12013322015
12014332015
12015342015
2201025
2201126
2201227
2201328
2201429
2201530
2201631
2201732
2201833
3201224
3201325
3201426
3201527
3201628
3201729
3201830

恳请各位提供实现建议。


实现方案

用Pandas可以高效完成需求,以下是具体步骤:

1. 预处理数据

先把death列的空值替换为2018,统一终止条件,减少分支判断:

import pandas as pd

# 构建测试DataFrame
df = pd.DataFrame({
    'ID': [1, 2, 3],
    'year': [1999, 1984, 2012],
    'age': [18, 25, 24],
    'death': [2015, pd.NA, pd.NA]
})

# 将空死亡年份替换为2018,统一终止逻辑
df['death'] = df['death'].fillna(2018)

2. 展开每行数据

定义函数处理单行数据,生成从起始年份到终止年份的序列,同时计算对应年龄:

def expand_row(row):
    start_year = row['year']
    # 取死亡年份和2018的最小值作为终止年份
    end_year = min(row['death'], 2018)
    # 生成年份序列
    year_range = range(start_year, end_year + 1)
    # 计算对应年龄:起始年龄 + 年份差
    age_list = [row['age'] + (y - start_year) for y in year_range]
    # 还原空值:如果原死亡年份是填充的2018,换回pd.NA
    death_val = row['death'] if row['death'] != 2018 else pd.NA
    # 返回单行展开后的DataFrame
    return pd.DataFrame({
        'ID': [row['ID']] * len(year_range),
        'year': year_range,
        'age': age_list,
        'death': [death_val] * len(year_range)
    })

# 遍历每行并合并结果
final_df = pd.concat([expand_row(row) for _, row in df.iterrows()], ignore_index=True)

3. 结果说明

运行后final_df的结构和数据完全匹配你给出的示例。这种实现方式逻辑清晰,利用Pandas的向量化操作和列表推导式保证效率,同时通过预处理统一终止条件,避免复杂的分支判断。


内容的提问来源于stack exchange,提问作者Bobby Zhao Sheng Lo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 11:45:34