如何基于Date列的最大年份条件更新DataFrame的Tag字段
问题描述
现有DataFrame如下:
id Date Tag 01 sep 2021 - 2023 ok 02 feb 2019 - aug 2020 ok 03 07/2022 - 11/2022 ok 04 2013-2017 ok
需求:提取Date列中的最大年份,若该年份≤2020,则将对应行的Tag更新为Old,否则保持不变。预期结果如下:
id Date Tag 01 sep 2021 - 2023 ok 02 feb 2019 - aug 2020 Old 03 07/2022 - 11/2022 ok 04 2013-2017 Old
已尝试使用df['Dates'].dt.year.max()方法,但不清楚如何添加条件语句实现该需求。
解决方案
步骤1:提取每行的最大年份
Date列是字符串格式,无法直接用dt.year处理,需要先从字符串中提取所有4位年份数字,再取每行的最大值:
# 提取所有4位数字年份,转整数后按行取最大值 df['max_year'] = df['Date'].str.extractall(r'(\d{4})').astype(int).groupby(level=0).max()
步骤2:根据条件更新Tag列
有两种简洁的实现方式:
方法1:用numpy.where批量判断
import numpy as np df['Tag'] = np.where(df['max_year'] <= 2020, 'Old', df['Tag'])
方法2:用pandas.loc定位更新
df.loc[df['max_year'] <= 2020, 'Tag'] = 'Old'
步骤3:清理临时列(可选)
如果不需要保留max_year列,可直接删除:
df.drop('max_year', axis=1, inplace=True)
完整可运行代码
import pandas as pd import numpy as np # 构造原始DataFrame data = { 'id': ['01', '02', '03', '04'], 'Date': ['sep 2021 - 2023', 'feb 2019 - aug 2020', '07/2022 - 11/2022', '2013-2017'], 'Tag': ['ok']*4 } df = pd.DataFrame(data) # 提取每行最大年份 df['max_year'] = df['Date'].str.extractall(r'(\d{4})').astype(int).groupby(level=0).max() # 更新Tag列 df.loc[df['max_year'] <= 2020, 'Tag'] = 'Old' # 删除临时列 df.drop('max_year', axis=1, inplace=True) print(df)
内容的提问来源于stack exchange,提问作者Romi
相关产品推荐
相关产品推荐

