You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 22:57:20