如何获取Pandas DataFrame每行最大值的所有列索引?
获取Pandas DataFrame每行所有最大值的列索引
没问题,我刚好处理过类似的需求!idxmax()确实只会返回每行最大值的首次出现位置,要拿到所有对应最大值的列索引,这里有两种实用的方法,分别适合不同规模的数据集:
先构造示例DataFrame
先拿一个包含多行多最大值的示例数据来演示:
import pandas as pd import numpy as np df = pd.DataFrame({ 'A': [3, 5, 2], 'B': [5, 5, 2], 'C': [3, 3, 2] })
方法1:用apply逐行处理(代码简洁,适合小数据)
这种写法直观易懂,用apply遍历每行,先找到该行的最大值,再筛选出所有等于最大值的列,最后提取索引转成列表:
max_col_indices = df.apply(lambda row: row[row == row.max()].index.tolist(), axis=1)
运行后得到的结果是一个Series,每行对应该行所有最大值的列名列表:
0 [A, B] 1 [A, B] 2 [A, B, C] dtype: object
方法2:用numpy实现(效率更高,适合大数据集)
如果你的DataFrame行数很多,apply的循环效率会比较低,这时候用numpy的向量化操作会快很多:
# 先获取每行的最大值,转成二维数组以便和原数据逐元素比较 row_max_vals = df.max(axis=1).values[:, np.newaxis] # 生成布尔矩阵,标记每个位置是否等于该行最大值 is_max = df.values == row_max_vals # 遍历每个布尔掩码,提取对应的列名 max_col_indices = pd.Series( [df.columns[mask].tolist() for mask in is_max], index=df.index )
额外需求:获取整数位置索引
如果你需要的是列的整数位置(而不是列名),只需要把df.columns换成np.arange(df.shape[1])即可:
max_pos_indices = pd.Series( [np.where(mask)[0].tolist() for mask in is_max], index=df.index )
结果会是类似[0,1]、[0,1]、[0,1,2]这样的整数索引列表。
内容的提问来源于stack exchange,提问作者narasimman
相关产品推荐
相关产品推荐

