Python pandas DataFrame如何根据行条件匹配符合要求的日期列名
实现方案
核心逻辑说明
所有计算先过滤掉排名为0的无效值,仅基于1-100之间的有效值处理:
- 对应需求1:按日期从早到晚(列从左到右)取第一个有效值对应的日期,作为
first_date_rank - 对应需求2:按日期从晚到早(列从右到左)取第一个有效值对应的日期,作为
last_date_rank - 对应需求3:取所有有效值的最小值为最优排名
best_rank,该排名第一次出现的日期为best_latest_date_rank
完整可运行代码
import pandas as pd # 构造示例数据 d = {'ID': ["id1","id2"], '26-01-2021': [0, 15],'01-02-2021': [12, 17],'01-03-2021': [58, 17]} df = pd.DataFrame(data=d) date_cols = df.columns.drop('ID').tolist() def process_row(row): date_vals = row[date_cols] # 过滤无效0值,保留(日期, 排名)的有序对,顺序和列顺序一致(从早到晚) valid_items = [(dt, val) for dt, val in zip(date_cols, date_vals) if val != 0] # 计算第一个有效日期 first_date = valid_items[0][0] # 计算最后一个有效日期 last_date = valid_items[-1][0] # 计算最优排名和对应首次出现日期 best_rank = min([item[1] for item in valid_items]) best_date = next(item[0] for item in valid_items if item[1] == best_rank) return pd.Series([first_date, last_date, best_date, best_rank]) # 新增结果列 df[['first_date_rank', 'last_date_rank', 'best_latest_date_rank', 'best_rank']] = df.apply(process_row, axis=1) print(df)
输出验证
ID 26-01-2021 01-02-2021 ... best_latest_date_rank best_rank 0 id1 0 12 ... 01-02-2021 12 1 id2 15 17 ... 26-01-2021 15 [2 rows x 8 columns]
内容的提问来源于stack exchange,提问作者vish community
相关产品推荐
相关产品推荐

