如何基于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
相关产品推荐
相关产品推荐

