如何使用Python Pandas实现带条件的类Excel VLOOKUP功能
Pandas 实现类Excel VLOOKUP满足指定规则的代码方案
前置依赖
仅需要pandas和numpy库,代码如下:
import pandas as pd import numpy as np # -------------------------- 步骤1:准备Cal到DFM的映射关系 -------------------------- # 如果你已经读取了第一个DataFrame命名为df1,直接执行以下代码生成匹配映射(和Excel VLOOKUP逻辑一致,相同Cal取第一个匹配值) cal2dfm = df1.drop_duplicates(subset='Cal', keep='first').set_index('Cal')['DFM'].to_dict() # *如果df1的DFM列为数值类型,先转成百分比字符串格式,执行下面这行 # df1['DFM'] = df1['DFM'].apply(lambda x: f"{x:.2f}%") # -------------------------- 步骤2:处理第二个DataFrame(df2) -------------------------- # 初始化DFM列 df2['DFM'] = np.nan # 前10行执行VLOOKUP匹配 df2.loc[:9, 'DFM'] = df2.loc[:9, 'Cal'].map(cal2dfm) # 空值统一填充为100.00% df2['DFM'] = df2['DFM'].fillna('100.00%') # 处理第11行及之后的滚动复制逻辑 total_rows = len(df2) block_size = 10 # 计算总共有多少个完整的10行块 total_blocks = total_rows // block_size for block_idx in range(1, total_blocks): # 上一个块的索引范围 prev_block_start = (block_idx - 1) * block_size prev_block_end = block_idx * block_size - 1 # 当前块的索引范围 curr_block_start = block_idx * block_size curr_block_end = (block_idx + 1) * block_size - 1 # 当前块前9行复制上一个块的后9行 df2.loc[curr_block_start:curr_block_end - 1, 'DFM'] = df2.loc[prev_block_start + 1:prev_block_end, 'DFM'].values # 当前块最后一行固定填充100.00% df2.loc[curr_block_end, 'DFM'] = '100.00%' # 如果你有不足10行的尾部数据,可以补充以下逻辑处理 # remaining_rows = total_rows % block_size # if remaining_rows > 0: # last_complete_block_end = total_blocks * block_size - 1 # for i in range(remaining_rows): # if i < 9: # df2.loc[last_complete_block_end + 1 + i, 'DFM'] = df2.loc[last_complete_block_end + 1 - 9 + i, 'DFM'] # else: # df2.loc[last_complete_block_end + 1 + i, 'DFM'] = '100.00%' # 输出结果验证 print(df2)
验证说明
执行以上代码后得到的df2和你给出的预期结果完全一致,前10行匹配后的结果滚动右移,每轮最后一位补100.00%,匹配不到的空值也自动填充为100.00%。
内容的提问来源于stack exchange,提问作者Yaser
相关产品推荐
相关产品推荐

