如何查找pandas DataFrame全表全局最大最小值及对应位置而非行列级最值
你可以通过pandas和numpy的内置向量化方法实现需求,无需自行遍历行列,性能更优。另外你之前写的按行获取最值的参数有误,正确参数为axis=1,正确写法是df.max(axis=1)。
场景1:需要最值对应的行标签、列名
可以通过stack()将DataFrame转为多级索引的Series,再用idxmax()/idxmin()直接获取最值位置:
import pandas as pd # 示例DataFrame df = pd.DataFrame({ '语文': [89, 92, 78], '数学': [95, 88, 96], '英语': [90, 93, 87] }) # 全局最大值及对应位置 global_max = df.stack().max() max_pos = df.stack().idxmax() print(f"全局最大值:{global_max},位置(行索引,列名):{max_pos}") # 全局最小值及对应位置 global_min = df.stack().min() min_pos = df.stack().idxmin() print(f"全局最小值:{global_min},位置(行索引,列名):{min_pos}")
输出示例:
全局最大值:96,位置(行索引,列名):(2, '数学') 全局最小值:78,位置(行索引,列名):(2, '语文')
场景2:需要最值对应的整数行号、列号(从0计数)
可以结合numpy的unravel_index方法直接解析最值的坐标:
import numpy as np # 全局最大值整数位置 max_row, max_col = np.unravel_index(df.values.argmax(), df.shape) global_max = df.iloc[max_row, max_col] print(f"全局最大值:{global_max},整数位置(行号,列号):{(max_row, max_col)}") # 全局最小值整数位置 min_row, min_col = np.unravel_index(df.values.argmin(), df.shape) global_min = df.iloc[min_row, min_col] print(f"全局最小值:{global_min},整数位置(行号,列号):{(min_row, min_col)}")
拓展:查找所有重复最值的位置
如果数据中存在多个相同的最值,需要返回所有位置,可以用布尔索引实现:
# 查找所有全局最大值的位置 all_max_pos = df[df == global_max].stack().index.tolist() print("所有全局最大值的位置:", all_max_pos)
以上方法均为原生向量化操作,无需自行遍历行列,性能远高于循环实现,符合pandas的最佳实践。
内容的提问来源于stack exchange,提问作者rubengavidia0x
相关产品推荐
相关产品推荐

