pandas不同大小DataFrame按ElementPage条件匹配填充empId实现方法
问题解法
错误原因分析
- 你调用的是
df1['empId'].apply(),传入lambda的x是df1.empId列的单个值(该列初始为空),无法通过x['ElementPage']获取其他列的值,需要对整个df1逐行遍历(df1.apply(..., axis=1))才能传入行对象。 - 逻辑错误:直接将df1单行的ElementPage值和df2.ElementPage整个Series比较,得到的是布尔类型的序列,对布尔值做下标取值自然会触发
TypeError: 'bool' object is not subscriptable报错。 - 性能问题:就算修复语法错误用行级apply实现,时间复杂度为O(n*m),数据量较大时执行效率极低。
正确实现方案
用pandas内置的pd.merge_asof()函数实现有序近邻匹配,专门适配这种区间阈值匹配场景,效率极高。
核心代码
import pandas as pd # 1. 先删除df1原有空empId列,保存原始索引用于恢复行顺序 df1 = df1.drop(columns='empId').reset_index(names='original_idx') # 2. 执行近邻匹配,按ElementPage找小于等于当前值的最近的df2记录 df_result = pd.merge_asof( # 左右表都需要按匹配键ElementPage升序排序 left=df1.sort_values('ElementPage'), right=df2.sort_values('ElementPage'), on='ElementPage', # backward表示找小于等于当前值的最近匹配,为默认值可省略 direction='backward' # 恢复原始行顺序,删除辅助索引列 ).sort_values('original_idx').drop(columns='original_idx')
运行结果说明
匹配逻辑完全符合需求,得到的df_result和你给出的预期输出完全一致:
| contact | phone | ElementPage | empId |
|---|---|---|---|
| Silvia Smith | 513-123-4567 | 2 | 7 |
| Barbara Smith | 513-123-4567 | 4 | 81 |
| Leimomi Yang | 513-123-4567 | 6 | 52 |
| SaraSmith | 513-123-4567 | 8 | 94 |
| Naomi Thomas | 513-123-4567 | 10 | 85 |
| Margot Thomas | 513-123-4567 | 10 | 85 |
| Bill Anderson | 513-123-4567 | 16 | 3 |
内容的提问来源于stack exchange,提问作者lug0lug0
相关产品推荐
相关产品推荐

