如何不使用for循环从不同DataFrame中匹配满足条件的取值?
解决方案:利用Numpy的searchsorted实现无循环匹配
刚好碰到过类似的场景!因为ext_map['mix']已经是升序排列,我们可以借助Numpy的searchsorted函数高效完成匹配,完全不需要写for循环,效率还很高。
具体实现代码
import pandas as pd import numpy as np # 初始化原始数据 df = pd.DataFrame(data={'true': [1, 2, 3], 'billed': [104, 50, 256]}) ext_map = pd.DataFrame(data={'label':[3.1, 2.5, 3.5], 'mix':[100, 200, 300]}) # 用searchsorted定位每个billed对应的匹配位置 match_positions = np.searchsorted(ext_map['mix'], df['billed'], side='left') # 根据位置提取对应的label值,赋值给新列 df['new_col'] = ext_map['label'].iloc[match_positions].values print(df)
代码逻辑解释
np.searchsorted(ext_map['mix'], df['billed'], side='left'):这个函数专门针对升序列表工作,会为每个billed值找到序列中第一个大于等于它的元素的索引。比如:- 50在
[100,200,300]里,第一个大于等于它的是100,对应索引0; - 104对应的是200,索引1;
- 256对应的是300,索引2。
- 50在
- 拿到这些索引后,直接从
ext_map['label']中提取对应值,就能快速生成new_col列。
运行结果
true billed new_col 0 1 104 2.5 1 2 50 3.1 2 3 256 3.5
内容的提问来源于stack exchange,提问作者loadbox
相关产品推荐
相关产品推荐

