如何为DataFrame的filter10列每行匹配REF列最近值并计算差值
问题描述
我多次搜索都没找到解决方案,现有如下DataFrame:
filter10 REF 0 NaN 0.00 1 NaN 0.75 2 NaN 1.50 3 NaN 2.25 4 NaN 3.00 5 NaN 3.75 6 NaN 4.50 ... 15 2.804688 11.25 16 3.021875 12.00 17 3.578125 12.75 18 3.779688 13.50 ... 27 NaN 20.25 28 NaN 21.00 29 NaN 21.75 30 NaN 22.50 31 6.746875 NaN 32 NaN NaN ...
需要新增一列df['DIFF'],遍历filter10列,当遇到非NaN数值时,找到REF列中最接近该数值的值,计算两者差值(filter10数值 - 最接近的REF值)并填入对应行;filter10为NaN时,DIFF也为NaN。
期望输出如下:
filter10 REF DIFF 0 NaN 0.00 NaN 1 NaN 0.75 NaN 2 NaN 1.50 NaN 3 NaN 2.25 NaN 4 NaN 3.00 NaN 5 NaN 3.75 NaN 6 NaN 4.50 NaN ... 15 2.804688 11.25 -0.195312 # 2.804688 - 3 (REF中最接近的值) = -0.195312 16 3.021875 12.00 0.021875 17 3.578125 12.75 -0.171875 18 3.779688 13.50 0.029688 ... 27 NaN 20.25 NaN 28 NaN 21.00 NaN 29 NaN 21.75 NaN 30 NaN 22.50 NaN 31 6.746875 NaN -0.003125 32 NaN NaN NaN ...
解决方案
可以利用numpy的argmin快速定位最接近的值,代码实现如下:
import pandas as pd import numpy as np # 提取REF列中的有效数值(排除NaN) ref_valid_values = df['REF'].dropna().values def compute_diff(filter_val): if pd.isna(filter_val): return np.nan # 计算当前值与所有REF有效数值的绝对差,找到差值最小的索引 closest_idx = np.argmin(np.abs(ref_valid_values - filter_val)) closest_ref_val = ref_valid_values[closest_idx] # 返回filter10值与最接近REF值的差 return filter_val - closest_ref_val # 生成DIFF列 df['DIFF'] = df['filter10'].apply(compute_diff)
代码说明
ref_valid_values:提前提取REF列的非NaN值,避免计算时被干扰compute_diff函数:判断当前filter10值是否为NaN,是则返回NaN;否则通过计算绝对差找到最接近的REF值,最终返回差值apply方法:遍历filter10列的每个值,批量生成DIFF列的结果
内容的提问来源于stack exchange,提问作者nezaslo4
相关产品推荐
相关产品推荐

