如何用Pandas实现类似Excel Vlookup的阈值匹配,查找最新日期
Pandas实现类似Vlookup的阈值匹配并获取最新日期
需要根据Table1中每个Name对应的Threshold1和Threshold2阈值,在Table2中查找该Name下Value等于对应阈值的最新Date,最终生成包含阈值及对应最新日期的结果表。
示例数据构造
import pandas as pd # Table1 阈值表 table1 = pd.DataFrame({ 'Name': ['A', 'B'], 'Threshold1': [9, 14], 'Threshold2': [8, 13] }) # Table2 日期-数值表 table2 = pd.DataFrame({ 'Date': ['1/1', '1/2', '1/3', '1/4', '1/5', '1/1', '1/2', '1/3', '1/4', '1/5'], 'Name': ['A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B'], 'Value': [10, 9, 9, 8, 8, 15, 14, 14, 13, 13] })
解决方案
步骤1:提取每个Name-Value组合的最新日期
对Table2按Name和Value分组,取每组中最大的Date(即最新日期):
# 分组获取每个Name-Value对应的最新日期 latest_dates = table2.groupby(['Name', 'Value'])['Date'].max().reset_index()
步骤2:转换为宽格式匹配阈值列
将上述结果转换为宽格式,让每个阈值对应一列日期,方便后续与Table1合并:
# 转宽格式,给日期列添加阈值前缀 latest_dates_wide = latest_dates.pivot( index='Name', columns='Value', values='Date' ).add_prefix('Threshold').rename(columns=lambda x: x + '_Date')
步骤3:合并阈值表与日期表
将处理后的日期表和Table1合并,得到基础结果:
# 合并表,保留Table1所有列并添加对应日期列 result = table1.merge(latest_dates_wide, on='Name', how='left')
步骤4:调整列顺序与命名(匹配期望格式)
如果需要完全贴合期望的结果列顺序和命名,执行以下操作:
# 调整列顺序 result = result[['Name', 'Threshold1', 'Threshold9_Date', 'Threshold2', 'Threshold13_Date']] # 重命名列名 result = result.rename(columns={ 'Threshold9_Date': 'Threshold1_Date', 'Threshold13_Date': 'Threshold2_Date' })
最终结果
调整后的result输出与期望一致:
Name Threshold1 Threshold1_Date Threshold2 Threshold2_Date 0 A 9 1/3 8 1/5 1 B 14 1/3 13 1/5
内容的提问来源于stack exchange,提问作者Elaine Yang
相关产品推荐
相关产品推荐

