如何快速查找DataFrame某列指定区间的最大值?
问题
需要查找DataFrame中某列指定位置区间内的最大值,当前使用df.loc[5:15, '分数'].max()可以实现,但运行速度极慢。需加速方法,且只需返回任意一个最大值即可。
示例DataFrame片段(实际包含更多列):
| 科目 | 分数 |
|---|---|
| 数学 | 22 |
| 数学 | 21 |
| 数学 | 22 |
| 数学 | 19 |
| 数学 | 19 |
| 数学 | 19 |
| 数学 | 23 |
| 数学 | 21 |
| 数学 | 25 |
| 数学 | 22 |
| 数学 | 23 |
| 数学 | 22 |
| 数学 | 20 |
| 数学 | 19 |
| 数学 | 19 |
| 数学 | 19 |
| 数学 | 24 |
| 数学 | 21 |
| 数学 | 22 |
| 数学 | 24 |
预期结果:25
加速方案
以下几种方法能显著提升性能,尤其适用于大型DataFrame:
使用
iloc替代loc:当索引为默认整数序列时,iloc基于位置的切片效率远高于loc的标签切片。注意iloc是左闭右开区间,因此原5:15(包含15)需改为5:16:df.iloc[5:16, df.columns.get_loc('分数')].max()先提取列再切片:先将目标列转为Series,再进行位置切片求最大值,操作更简洁且性能更优:
df['分数'].iloc[5:16].max()借助Numpy数组操作:Pandas的Series底层基于Numpy数组,直接转换为Numpy数组后切片求最大值,利用Numpy的C级优化实现最快速度:
df['分数'].to_numpy()[5:16].max()
以上三种方法在示例DataFrame中均会返回25,满足需求。
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

