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

使用Pandas查找每行最大值90%邻近值的列索引问题

Pandas逐行查找最接近指定值元素的列索引解决方案

问题场景

你需要处理最多20万行、495列的CSV数据,逐行完成:

  1. 获取该行最大值
  2. 计算最大值的90%
  3. 找到该行中最接近此90%值的元素对应的列索引

已完成前两步:

maxValues = df.max(axis=1)
newmax = maxValues / 10 * 9

第三步尝试代码时触发维度不匹配错误:

arr = pulses.to_numpy()
x = newmax.values
difference_array = np.absolute(arr-x).axis=1
index = difference_array.argmin().axis=1

错误信息:operands could not be broadcast together with shapes (114,495) (114,)

错误根源

  1. 广播维度不匹配:arr是二维数组(行数×列数),x是一维数组(行数),numpy无法直接对这两个形状执行减法运算,需要将x转换为二维数组(行数×1)以满足广播规则。
  2. 语法错误:.axis=1的写法不正确,正确方式是在numpy函数中通过参数指定axis。

解决代码

高效向量化方案(推荐用于20万行大数据)

利用numpy广播和向量化操作,避免循环,性能最优:

import numpy as np

# 将DataFrame转为numpy数组(假设你的DataFrame变量是df,若为pulses则替换)
arr = df.to_numpy()
# 将目标值数组转为二维,形状变为(行数, 1),适配广播
target = newmax.values.reshape(-1, 1)

# 计算每行元素与目标值的绝对差,逐行取最小差值的索引
closest_col_indices = np.abs(arr - target).argmin(axis=1)

# 若需要获取列名而非数字索引:
closest_col_names = df.columns[closest_col_indices]

Pandas apply方案(适合小数据量)

如果数据量较小,也可以用apply逐行处理(注意:大数据下速度远慢于numpy方案):

def get_closest_col(row, target_val):
    # 计算该行每个元素与目标值的绝对差,返回最小差的索引
    return np.abs(row - target_val).argmin()

# 逐行应用函数,传入对应行的目标值
closest_col_indices = df.apply(lambda row, t: get_closest_col(row, t), t=newmax, axis=1)

验证说明

以你给出的示例:某行最大值12098,90%为10888,运行代码后会自动找到该行最接近10888的元素列索引,若最大值本身是最接近的,会返回其所在的列索引。

内容的提问来源于stack exchange,提问作者kim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 00:24:25