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

Pandas中是否有更快的方法获取每行最大值的全部索引?

更高效的实现方法

你的需求是获取每行中等于最大值的所有列索引,原代码的循环逻辑在数据量较大时效率偏低,以下是几种更简洁且高效的实现方式:

方法1:Pandas apply 直观实现

利用apply逐行处理,结合布尔索引筛选出等于最大值的列索引,代码简洁易读:

Cellvoltage['max_voltage_idx'] = Cellvoltage.apply(
    lambda row: row[row == row.max()].index.values,
    axis=1
)

适合中小规模数据集,逻辑清晰易懂。

方法2:纯NumPy向量化操作

完全基于NumPy的向量化运算,避免Python循环,在大数据量下性能最优:

# 计算每行的最大值(保持维度以便广播比较)
max_vals = Cellvoltage.values.max(axis=1, keepdims=True)
# 生成每行等于最大值的布尔掩码
mask = Cellvoltage.values == max_vals
# 获取所有符合条件的行、列索引
rows, cols = np.where(mask)
# 按行分组整理索引
from itertools import groupby
from operator import itemgetter

max_indices = []
for _, group in groupby(zip(rows, cols), key=itemgetter(0)):
    max_indices.append(np.array([col for _, col in group]))

Cellvoltage['max_voltage_idx'] = max_indices

方法3:Pandas stack 原生操作

利用Pandas的stack和分组功能,更贴合Pandas的操作习惯:

# 生成每行等于最大值的布尔DataFrame
mask = Cellvoltage.eq(Cellvoltage.max(axis=1), axis=0)
# 堆叠后分组提取列索引
Cellvoltage['max_voltage_idx'] = (
    mask.stack()
    .reset_index(level=1)
    .groupby(level=0)['level_1']
    .apply(np.array)
)

这种方法无需额外导入库,完全用Pandas原生API实现,可读性和性能都不错。

性能对比

原代码中的Python循环会随着数据行数增加显著变慢,上述三种方法均采用向量化或内置分组逻辑,执行效率远高于原实现,其中纯NumPy方法在超大规模数据集上表现最优。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 18:35:51