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

如何基于Name列条件生成Pandas新Year列?

问题:基于Pandas规则更新Year列

原始数据

首先定义原始DataFrame:

import pandas as pd
from pandas import Timestamp

df = pd.DataFrame({
    'Year': {0: 2018, 1: 2019, 2: 2020, 3: 2020, 4: 2021},
    'IndexDate': {0: pd.NaT, 1: Timestamp('2019-01-09 00:00:00'), 2: Timestamp('2020-11-27 00:00:00'), 3: pd.NaT, 4: pd.NaT},
    'WorkDate': {0: Timestamp('2018-12-12 00:00:00'), 1: Timestamp('2019-01-09 00:00:00'), 2: Timestamp('2020-11-27 00:00:00'), 3: Timestamp('2020-11-27 00:00:00'), 4: Timestamp('2021-01-19 00:00:00')},
    'ID': {0: 9265299, 1: 9265299, 2: 9962241, 3: 9962241, 4: 9962241},
    'Name': {0: 'FV', 1: 'OM', 2: 'PM', 3: 'Other', 4: 'Other'}
})

数据类型:

df.dtypes
# 输出:
# Year                  int64
# IndexDate    datetime64[ns]
# WorkDate     datetime64[ns]
# ID                    int64
# Name                 object
# dtype: object

更新规则

需要更新Year列,规则如下:

  • 当Name为OM或PM时,保留原Year值;
  • 当Name为FV或Other时,替换为该ID对应的IndexDate的年份(每个ID对应唯一有效IndexDate)。

解决方案

步骤1:构建ID与IndexDate年份的映射

先提取每个ID对应的有效IndexDate年份:

# 过滤出有有效IndexDate的行,构建ID到年份的字典
id_index_year = df.dropna(subset=['IndexDate']).set_index('ID')['IndexDate'].dt.year.to_dict()

步骤2:按规则更新Year列

使用np.where高效完成条件替换:

import numpy as np

df['Year'] = np.where(
    df['Name'].isin(['FV', 'Other']),  # 判断是否需要替换的条件
    df['ID'].map(id_index_year),       # 替换后的值:通过ID映射得到对应年份
    df['Year']                         # 不满足条件时保留原Year值
)

最终结果

执行后得到目标DataFrame:

print(df)
# 输出:
#    Year IndexDate   WorkDate       ID   Name
# 0  2019       NaT 2018-12-12  9265299     FV
# 1  2019 2019-01-09 2019-01-09  9265299     OM
# 2  2020 2020-11-27 2020-11-27  9962241     PM
# 3  2020       NaT 2020-11-27  9962241  Other
# 4  2020       NaT 2021-01-19  9962241  Other

内容的提问来源于stack exchange,提问作者Shichimi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 04:40:23