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
相关产品推荐
相关产品推荐

