如何将嵌套VLOOKUP与MATCH的Excel公式转换为Pandas实现
Excel公式转Pandas合并操作实现
公式逻辑拆解
原始Excel公式的计算逻辑如下:
- 首先判断当前行J列(对应
df_1['Data(COLUMN_J)'])是否为空,为空直接返回7 - 不为空的情况下:
- 用当前行I列的COD值(
df_1['COD(COLUMN_I)'])匹配Abrang表的COD列 - 用当前行L列的Type值(
df_1['Type(COLUMN_L)'])匹配Abrang表的对应Type列 - 匹配成功返回对应值,匹配失败返回0
- 用当前行I列的COD值(
实现代码
你可以通过宽表转长表+左合并的方式实现需求,完整代码如下:
import pandas as pd # 你给出的两个DataFrame定义 data_1 = {'COD(COLUMN_I)': [763807643,45968455,56565435,5833250], 'Data(COLUMN_J)':["16/11/2021","19/11/2021","19/11/2021","09/11/2021"], 'Type(COLUMN_L)': ["Type 1", "Type 2","Type 3","Type 4"]} data_2 = {'COD(COLUMN_I)': [763807643,45968455,56565435,5833250], 'Type_1':["4","21","9","8"], 'Type_2': ["5", "45","3","8"], 'Type_3': ["12", "43","54","6"], 'Type_4': ["7", "5","2","1"] } df_1 = pd.DataFrame(data=data_1) Abrang = pd.DataFrame(data=data_2) # 步骤1:将Abrang宽表转为长表,适配合并逻辑 Abrang_long = Abrang.melt( id_vars='COD(COLUMN_I)', var_name='match_type', value_name='match_result' ) # 把Abrang的Type字段下划线替换为空格,和df_1的Type格式对齐 Abrang_long['match_type'] = Abrang_long['match_type'].str.replace('_', ' ') # 步骤2:左合并两个表,保留df_1所有行 merged_df = df_1.merge( Abrang_long, left_on=['COD(COLUMN_I)', 'Type(COLUMN_L)'], right_on=['COD(COLUMN_I)', 'match_type'], how='left' ) # 步骤3:按照Excel公式逻辑生成最终结果列 merged_df['final_result'] = merged_df.apply( lambda row: 7 if pd.isna(row['Data(COLUMN_J)']) or row['Data(COLUMN_J)'].strip() == '' else int(row['match_result']) if not pd.isna(row['match_result']) else 0, axis=1 ) # 清理不需要的中间字段 merged_df = merged_df.drop(columns=['match_type', 'match_result'])
结果说明
最终得到的merged_df就是合并后的目标表,其中final_result列对应Excel公式的计算结果,按照你给出的示例数据,计算结果依次为4、45、54、1。如果需要实现原Excel中VLOOKUP的近似匹配逻辑,只需要在合并前对Abrang表按COD(COLUMN_I)升序排序即可。
内容的提问来源于stack exchange,提问作者João Galdino
相关产品推荐
相关产品推荐

