Pandas实现获取每行最大日期的最后出现列名(同值取后列)
解决DataFrame中取最大日期对应最后一列的问题
给定如下结构的DataFrame df:
| Id | Stage1 | Stage2 | Stage3 |
|---|---|---|---|
| 1 | 2022-02-01 | 2020-04-03 | 2022-06-07 |
| 2 | 2023-06-07 | 2020-03-01 | 2020-09-03 |
| 3 | 2023-02-04 | 2023-06-07 | 2022-06-07 |
| 4 | 2022-05-08 | 2023-09-01 | 2023-09-01 |
需求是为每个Id找到最大日期对应的Stage列,当多个Stage列日期相同时,取最后出现的列(如Id4需返回Stage3而非Stage2)。默认的df.filter(like="Stage").idxmax(axis=1)会返回第一个出现最大值的列,无法满足需求,可通过以下两种方法实现:
方法一:反转列顺序后使用idxmax
核心思路是反转Stage列的顺序,让原本靠后的列优先被idxmax检测,这样相同最大值会返回反转后的第一个列(即原顺序的最后一列):
import pandas as pd # 确保日期列为datetime类型(若原数据是字符串格式) df[['Stage1', 'Stage2', 'Stage3']] = df[['Stage1', 'Stage2', 'Stage3']].apply(pd.to_datetime) # 获取所有Stage列并反转顺序 stage_cols = df.filter(like='Stage').columns reversed_stage_cols = stage_cols[::-1] # 计算每行最大日期对应的Stage列 df['MaxStage'] = df[reversed_stage_cols].idxmax(axis=1)
方法二:逐行筛选最大日期的最后一列
通过自定义函数逐行处理,找到所有等于最大日期的列后取最后一个:
import pandas as pd # 转换日期列类型 df[['Stage1', 'Stage2', 'Stage3']] = df[['Stage1', 'Stage2', 'Stage3']].apply(pd.to_datetime) stage_cols = df.filter(like='Stage').columns def get_last_max_stage(row): max_date = row[stage_cols].max() # 筛选出所有等于最大日期的列,取最后一个 max_cols = row[stage_cols][row[stage_cols] == max_date].index return max_cols[-1] df['MaxStage'] = df.apply(get_last_max_stage, axis=1)
两种方法最终都会生成符合预期的MaxStage列:
| Id | MaxStage |
|---|---|
| 1 | Stage3 |
| 2 | Stage1 |
| 3 | Stage2 |
| 4 | Stage3 |
内容的提问来源于stack exchange,提问作者Sriya TR
相关产品推荐
相关产品推荐

