Pandas如何提取DataFrame每行与price最接近的gain列数值
问题排查
你的代码存在两个核心问题:
- 误用
idxmin(axis=1):该方法返回的是每行最小值对应的列名,不是目标单元格的数值 - 多余的
.sub(1)逻辑:你需要计算的是gain列值和同行price的差值,不需要给所有gain值统一减1
正确实现方案
写法1:易读版(小数据集适用)
逻辑直观易维护,不需要额外依赖:
# 筛选所有列名包含gain的列 gain_part = df.filter(like='gain') # 逐行找到和price差值最小的gain值 df['closestvalue'] = gain_part.apply( lambda row: row[(row - df.loc[row.name, 'price']).abs().idxmin()], axis=1 ) # 提取需要的输出列 result = df[['SYMBOL', 'price', 'closestvalue']] print(result)
写法2:向量化版(大数据集性能更优)
避免逐行循环的开销,万行以上数据运行速度提升明显:
import numpy as np gain_part = df.filter(like='gain') # 广播计算所有gain值和对应行price的绝对差值 abs_diff = gain_part.sub(df['price'], axis=0).abs() # 定位每行差值最小的位置,提取对应原始值 df['closestvalue'] = gain_part.values[np.arange(len(gain_part)), abs_diff.values.argmin(axis=1)] result = df[['SYMBOL', 'price', 'closestvalue']] print(result)
注意:pandas 1.4.0及以上版本已经废弃
lookup方法,直接使用numpy数组索引定位取值即可,兼容性更好。
两种写法运行后都会输出你期望的结果:
SYMBOL price closestvalue 102 1000SHIBUSDT 0.016049 -26.800171 9 ADAUSDT 0.572700 -1.000000 24 ALGOUSDT 0.391300 0.510450
内容的提问来源于stack exchange,提问作者One boy
相关产品推荐
相关产品推荐

