如何以向量化方式为Pandas DataFrame每行匹配列表最近元素
向量化实现Pandas列匹配列表中最接近元素
给定如下Pandas DataFrame和对比列表,需要为DataFrame新增assigned_value列,每行取值为对比列表中与Results列对应值最接近的元素,以下是无需循环或apply的向量化实现方案:
原始数据
import pandas as pd import numpy as np df = pd.DataFrame({'Results': [90, 80, 70, 60, 50, 40, 30, 20, 10]}) comparation_list = [83, 72, 65, 40, 36, 22, 15, 12]
向量化实现步骤
将对比列表转换为numpy数组,便于后续广播运算:
comp_arr = np.array(comparation_list)利用numpy广播机制,计算
Results列每个值与对比列表所有元素的绝对差值:# 将Results转为二维数组,实现与对比数组的逐元素运算 diff = np.abs(df['Results'].values[:, np.newaxis] - comp_arr)按行找出差值最小的元素索引:
min_indices = diff.argmin(axis=1)根据索引映射得到对应最接近值,新增到DataFrame中:
df['assigned_value'] = comp_arr[min_indices]
最终结果
执行上述代码后,DataFrame输出如下:
Results assigned_value 0 90 83 1 80 83 2 70 72 3 60 65 4 50 40 5 40 40 6 30 36 7 20 22 8 10 12
原理说明
- 借助numpy广播特性,避免逐行循环,将运算转化为矩阵级操作,大幅提升效率;
argmin(axis=1)实现向量化的最小值索引查找,性能远优于apply的逐行处理方式。
内容的提问来源于stack exchange,提问作者Daniel Echenique
相关产品推荐
相关产品推荐

