查看全课大纲(第 50 / 101 节)
  1. 1.数据分析基本概念
  2. 2.学习数据分析的一般路线
  3. 3.数据分析的流程
  4. 4.数据类型
  5. 5.环境部署(1)
  6. 6.环境部署(2)
  7. 7.课程介绍
  8. 8.TXT文件操作
  9. 9.JSON文件操作
  10. 10.CSV文件操作
  11. 11.Excel文件操作
  12. 12.数据库及SQL常用语法
  13. 13.数据库基本操作
  14. 14.数据库多表连接
  15. 15.实战:欧洲职业足球数据库分析
  16. 16.爬虫简介
  17. 17.URL管理模块
  18. 18.网页下载模块
  19. 19.网页解析模块(1)
  20. 20.网页解析模块(2)
  21. 21.Scrapy简介
  22. 22.Scrapy使用步骤(1)
  23. 23.Scrapy使用步骤(2)
  24. 24.Scrapy使用步骤(3)
  25. 25.Scrapy使用步骤(4)
  26. 26.实战:获取国内城市空气质量指数数据
  27. 27.NumPy和SciPy介绍
  28. 28.多维数组
  29. 29.多维数组操作
  30. 30.NumPy的常用方法
  31. 31.向量化介绍
  32. 32.向量化及通用函数
  33. 33.实战:2016美国大选分析
  34. 34.数据结构-Series
  35. 35.数据结构-DataFrame
  36. 36.数据结构-Index
  37. 37.Series的索引操作
  38. 38.DataFrame的索引操作
  39. 39.索引操作总结
  40. 40.运算与对齐
  41. 41.函数应用操作(1) -- map
  42. 42.函数应用操作 (2) -- apply applymap
  43. 43.文件读写操作
  44. 44.排序操作
  45. 45.数据清洗--处理缺失数据
  46. 46.数据清洗--处理重复数据
  47. 47.数据清洗--替换数据
  48. 48.常用统计方法(1) -- describe quantile
  49. 49.常用统计方法(2) -- sum mean median count
  50. 50.常用统计方法(3) -- max min idxmax idxmin
  51. 51.常用统计方法(4) -- mad var std cumsum
  52. 52.实战:全球食品数据分析
  53. 53.层级索引
  54. 54.分组与聚合介绍
  55. 55.分组操作(1) -- GroupBy对象及常用聚合操作
  56. 56.分组操作(2) -- 自定义分组及聚合操作
  57. 57.透视表介绍
  58. 58.透视表操作
  59. 59.数据规整(1) -- 数据合并concat
  60. 60.数据规整(2) -- 数据连接merge
  61. 61.数据重构(3) -- 数据重构stack unstack
  62. 62.实战:互联网电影资料库分析
  63. 63.探索性数据分析EDA介绍
  64. 64.EDA的目的
  65. 65.EDA常用工具
  66. 66.Matplotlib绘图基本介绍
  67. 67.Matplotlib画布
  68. 68.散点图和柱状图的绘制
  69. 69.直方图的绘制
  70. 70.矩阵绘图
  71. 71.子图的使用
  72. 72.Matplotlib颜色、标记、线型
  73. 73.Matplotlib坐标刻度、标签、图例、标题
  74. 74.Seaborn介绍
  75. 75.数据集分布可视化(1) -- 单变量分布、双变量分布
  76. 76.数据集分布可视化(2) -- 变量关系可视化
  77. 77.类别数据可视化 -- 类别散布图、类别内数据分布、类别内统计图
  78. 78.交互式数据可视化工具Bokeh介绍
  79. 79.Bokeh绘制散点图、柱状图、盒子图、弦图
  80. 80.Bokeh绘制常用图形元素
  81. 81.3D绘图 -- mplot3d
  82. 82.3D曲线可视化
  83. 83.3D散点图可视化
  84. 84.3D柱状图可视化
  85. 85.Pandas绘图
  86. 86.实战:Lending Club借贷数据探索性分析及可视化
  87. 87.机器学习介绍及应用场景
  88. 88.机器学习建模介绍 (1) -- 分类
  89. 89.机器学习建模介绍 (2) -- 回归
  90. 90.机器学习建模介绍 (3) -- 聚类
  91. 91.机器学习分类
  92. 92.机器学习工具scikit-learn
  93. 93.使用scikit-learn的流程
  94. 94.数据集准备及划分
  95. 95.模型选择
  96. 96.数据预处理及特征工程
  97. 97.过拟合与欠拟合
  98. 98.模型调参介绍
  99. 99.模型调参方法
  100. 100.模型测试及评价
  101. 101.实战:通过移动设备行为数据预测性别和年龄

常用统计方法(3) -- max min idxmax idxmin

约 4 分钟

📺 正在播放小象学院官方高清录播(支持倍速与清晰度调节)

常用统计方法(3) — max、min、idxmax、idxmin

小象实战讲义 · Python数据分析实战

在数据分析中,快速找到数据集中的极值(最大值、最小值)及其所在位置,是进行数据探索和异常值识别的基础操作。本节将学习 Pandas 提供的四个核心统计方法:max()、min()、idxmax() 和 idxmin(),它们能帮助你高效地定位数据中的关键信息点。

💡 核心导读

  • 最大值与最小值:掌握 max() 和 min() 方法,用于计算 Series 或 DataFrame 各列(或行)的最大值与最小值。
  • 极值索引定位:理解 idxmax() 和 idxmin() 的作用,它们返回最大值或最小值所在的索引标签。
  • 版本演进:了解 argmax() 和 argmin() 在近期 Pandas 版本中已被弃用,推荐使用 idxmax() 和 idxmin()。
  • 字符串排序规则:明确字符串类型数据在比较大小(求极值)时,遵循字母顺序的排序规则。
  • 实战应用:通过模拟的幸福指数数据集,综合运用这些方法进行数据探索。

1. 方法概述与基本用法

Pandas 提供了两组紧密相关的方法来寻找极值及其位置:

  1. max() 与 min():计算数据中的最大值和最小值。
  2. idxmax() 与 idxmin():返回最大值和最小值对应的索引(index)。

这里需要特别注意,idx 就是 index 的缩写。在早期的 Pandas 版本中,对应功能的方法名为 argmax() 和 argmin()。但在近期版本中,官方已提示将逐步停止使用 argmax 和 argmin,并推荐使用 idxmax 和 idxmin。因此,我们在今后的学习和实践中,应统一使用 idxmax 和 idxmin。

为了直观理解,我们先构造一个简单的 DataFrame 示例。

import pandas as pd

# 构造一个简单的DataFrame示例
simple_df = pd.DataFrame({
    'A': [0, 5, 2],
    'B': [8, 3, 3],
    'C': [4, 5, 6]
})
print("示例数据:")
print(simple_df)
print("\n数据类型:")
print(simple_df.dtypes)
示例数据:
   A  B  C
0  0  8  4
1  5  3  5
2  2  3  6

数据类型:
A    int64
B    int64
C    int64
dtype: object

2. max() 与 min() 详解

max() 和 min() 的使用非常简单。对 Series 调用,返回该 Series 的最大/最小值;对 DataFrame 调用,默认返回每一列的最大/最小值。

import pandas as pd

# 构造示例数据(每个代码块自包含)
simple_df = pd.DataFrame({
    'A': [0, 5, 2],
    'B': [8, 3, 3],
    'C': [4, 5, 6]
})

# 计算整个DataFrame每列的最大值和最小值
print("每列的最大值:")
print(simple_df.max())
print("\n每列的最小值:")
print(simple_df.min())

# 也可以针对单列(Series)进行计算
print(f"\n列'A'的最大值:{simple_df['A'].max()}")
print(f"列'A'的最小值:{simple_df['A'].min()}")
每列的最大值:
A    5
B    8
C    6
dtype: int64

每列的最小值:
A    0
B    3
C    4
dtype: int64

列'A'的最大值:5
列'A'的最小值:0

观察输出:

  • 列 A:值 [0, 5, 2],最大值是 5,最小值是 0。
  • 列 B:值 [8, 3, 3],最大值是 8,最小值是 3。
  • 列 C:值 [4, 5, 6],最大值是 6,最小值是 4。

3. idxmax() 与 idxmin() 详解

idxmax() 和 idxmin() 返回的是极值所在的索引位置,而不是极值本身。这对于定位数据行非常有用。

import pandas as pd

# 构造示例数据(每个代码块自包含)
simple_df = pd.DataFrame({
    'A': [0, 5, 2],
    'B': [8, 3, 3],
    'C': [4, 5, 6]
})

# 找出每列最大值对应的行索引
print("每列最大值对应的行索引:")
print(simple_df.idxmax())

print("\n每列最小值对应的行索引:")
print(simple_df.idxmin())

# 针对单列(Series)查找索引
print(f"\n列'A'最大值所在的索引:{simple_df['A'].idxmax()}")
print(f"列'A'最小值所在的索引:{simple_df['A'].idxmin()}")
每列最大值对应的行索引:
A    1
B    0
C    2
dtype: int64

每列最小值对应的行索引:
A    0
B    1
C    0
dtype: int64

列'A'最大值所在的索引:1
列'A'最小值所在的索引:0

我们来逐列验证:

  • 列 A:最大值 5 在索引 1 的位置(0, 5, 2),最小值 0 在索引 0 的位置。
  • 列 B:最大值 8 在索引 0 的位置(8, 3, 3)。最小值 3 在索引 1 和 2 的位置,idxmin() 默认返回第一个遇到的最小值索引,所以是 1。
  • 列 C:最大值 6 在索引 2 的位置(4, 5, 6),最小值 4 在索引 0 的位置。

这与我们之前学习的 NumPy 中的 argmax 和 argmin 功能一致,只是现在在 Pandas 中我们使用 idxmax 和 idxmin 这个更贴切的名称。

4. 字符串数据的极值处理

一个有趣的问题是:如果列中的数据是字符串,max() 和 min() 会返回什么?答案是:字符串可以排序,其大小比较基于字母顺序(对于英文而言)。max() 返回按字母顺序排在最后的字符串,min() 返回按字母顺序排在最前的字符串。

原课程使用了2016年全球幸福指数数据集进行演示。因年代较久,本节我们使用模拟的中性数据来演示同一套方法。

import pandas as pd

# 模拟一个小型幸福指数数据集(包含字符串和数值列)
simulated_happiness = pd.DataFrame({
    'Country': ['Finland', 'Denmark', 'Switzerland', 'Zimbabwe', 'Afghanistan'],
    'Region': ['Western Europe', 'Western Europe', 'Western Europe', 'Sub-Saharan Africa', 'South Asia'],
    'Happiness Score': [7.526, 7.509, 7.428, 3.875, 3.203],
    'Economy (GDP per Capita)': [1.441, 1.501, 1.566, 0.366, 0.350]
})
print("模拟幸福指数数据:")
print(simulated_happiness)
print("\n数据类型:")
print(simulated_happiness.dtypes)
模拟幸福指数数据:
       Country              Region  Happiness Score  Economy (GDP per Capita)
0      Finland      Western Europe            7.526                     1.441
1      Denmark      Western Europe            7.509                     1.501
2  Switzerland      Western Europe            7.428                     1.566
3     Zimbabwe  Sub-Saharan Africa            3.875                     0.366
4  Afghanistan          South Asia            3.203                     0.350

数据类型:
Country                         str
Region                          str
Happiness Score             float64
Economy (GDP per Capita)    float64
dtype: object

现在,我们对字符串列应用 max() 和 min()。

import pandas as pd

# 构造模拟数据(每个代码块自包含)
simulated_happiness = pd.DataFrame({
    'Country': ['Finland', 'Denmark', 'Switzerland', 'Zimbabwe', 'Afghanistan'],
    'Region': ['Western Europe', 'Western Europe', 'Western Europe', 'Sub-Saharan Africa', 'South Asia'],
    'Happiness Score': [7.526, 7.509, 7.428, 3.875, 3.203],
    'Economy (GDP per Capita)': [1.441, 1.501, 1.566, 0.366, 0.350]
})

print("'Country' 列的最大值(按字母顺序):", simulated_happiness['Country'].max())
print("'Country' 列的最小值(按字母顺序):", simulated_happiness['Country'].min())
print("\n'Region' 列的最大值(按字母顺序):", simulated_happiness['Region'].max())
print("'Region' 列的最小值(按字母顺序):", simulated_happiness['Region'].min())

# 数值列的极值
print(f"\n'Happiness Score' 最大值:{simulated_happiness['Happiness Score'].max():.3f}")
print(f"'Happiness Score' 最小值:{simulated_happiness['Happiness Score'].min():.3f}")
'Country' 列的最大值(按字母顺序): Zimbabwe
'Country' 列的最小值(按字母顺序): Afghanistan

'Region' 列的最大值(按字母顺序): Western Europe
'Region' 列的最小值(按字母顺序): South Asia

'Happiness Score' 最大值:7.526
'Happiness Score' 最小值:3.203

解释:

  • Country 列:按字母顺序,'Zimbabwe' (Z开头) 排在最后,是最大值;'Afghanistan' (A开头) 排在最前,是最小值。
  • Region 列:'Western Europe' (W开头) 比 'Sub-Saharan Africa' (S开头) 和 'South Asia' (S开头) 靠后,是最大值;'South Asia' 是三个中字母顺序最靠前的,是最小值。
  • Happiness Score 列:数值上的最大值是 7.526,最小值是 3.203。

5. 综合实战:定位幸福指数极值

在实际分析中,我们不仅想知道最高分和最低分是多少,更想知道是哪个国家(对应哪一行数据)获得了这个分数。这时 idxmax() 和 idxmin() 就派上用场了。

import pandas as pd

# 构造模拟数据(每个代码块自包含)
simulated_happiness = pd.DataFrame({
    'Country': ['Finland', 'Denmark', 'Switzerland', 'Zimbabwe', 'Afghanistan'],
    'Region': ['Western Europe', 'Western Europe', 'Western Europe', 'Sub-Saharan Africa', 'South Asia'],
    'Happiness Score': [7.526, 7.509, 7.428, 3.875, 3.203],
    'Economy (GDP per Capita)': [1.441, 1.501, 1.566, 0.366, 0.350]
})

# 找出幸福指数最高和最低的国家的行索引
max_happiness_idx = simulated_happiness['Happiness Score'].idxmax()
min_happiness_idx = simulated_happiness['Happiness Score'].idxmin()

print(f"幸福指数最高的行索引:{max_happiness_idx}")
print(f"对应的国家:{simulated_happiness.loc[max_happiness_idx, 'Country']},分数:{simulated_happiness.loc[max_happiness_idx, 'Happiness Score']:.3f}")

print(f"\n幸福指数最低的行索引:{min_happiness_idx}")
print(f"对应的国家:{simulated_happiness.loc[min_happiness_idx, 'Country']},分数:{simulated_happiness.loc[min_happiness_idx, 'Happiness Score']:.3f}")

# 也可以一次性查看所有数值列的极值索引
print("\n所有数值列最大值对应的行索引:")
print(simulated_happiness.select_dtypes(include=['number']).idxmax())
幸福指数最高的行索引:0
对应的国家:Finland,分数:7.526

幸福指数最低的行索引:4
对应的国家:Afghanistan,分数:3.203

所有数值列最大值对应的行索引:
Happiness Score             0
Economy (GDP per Capita)    2
dtype: int64

从输出可知:

  • 幸福指数最高的行索引是 0,对应国家是 Finland,分数为 7.526。
  • 幸福指数最低的行索引是 4,对应国家是 Afghanistan,分数为 3.203。
  • 对于另一数值列 Economy (GDP per Capita),最大值在索引 2 的位置,即 Switzerland。

📝 动手练一练

  1. 概念辨析:df.max() 和 df.idxmax() 返回的结果类型和含义有什么根本区别?如果对同一个数值列先后调用这两个方法,它们的结果之间有什么联系?
👉 点击查看参考答案

df.max() 返回的是数据中的最大值本身(一个标量或一个包含各列最大值的 Series),而 df.idxmax() 返回的是该最大值所在的索引标签(一个标量或一个包含各列最大值索引的 Series)。

它们之间的联系是:对于某一列 col,有 df.loc[df[col].idxmax(), col] == df[col].max()。即,通过 idxmax() 找到的索引位置,去数据中定位,得到的就是 max() 找到的最大值。

  1. 动手实践:假设你有一个记录每日销售额的 Series,名为 daily_sales,其索引为日期字符串(如 '2023-10-01')。请写出代码,找出销售额最高是哪一天,以及那天的具体销售额。
    # 假设 daily_sales 数据如下
    import pandas as pd
    daily_sales = pd.Series([12000, 15000, 8000, 21000, 18000],
                            index=['2023-10-01', '2023-10-02', '2023-10-03', '2023-10-04', '2023-10-05'])
👉 点击查看参考答案
import pandas as pd
daily_sales = pd.Series([12000, 15000, 8000, 21000, 18000],
                        index=['2023-10-01', '2023-10-02', '2023-10-03', '2023-10-04', '2023-10-05'])

# 找出最高销售额的日期(索引)
best_day = daily_sales.idxmax()
# 找出最高销售额
highest_sales = daily_sales.max()
# 或通过索引获取:highest_sales = daily_sales.loc[best_day]

print(f"销售额最高的一天是:{best_day}")
print(f"当天的销售额为:{highest_sales}")

运行结果:

销售额最高的一天是:2023-10-04
当天的销售额为:21000

本章小结

本节我们学习了 Pandas 中用于寻找极值及其位置的四个核心统计方法。它们是数据探索性分析(EDA)中快速了解数据分布和定位关键观测点的利器。

📋 行动清单

  • 掌握方法调用:在本地环境中,对一个包含数值和字符串列的 DataFrame 练习使用 max(), min(), idxmax(), idxmin(),观察其输出。
  • 理解索引含义:确保能清晰解释 idxmax() 返回的索引具体指向什么(是行标签还是列标签?)。
  • 版本习惯养成:在未来的代码中,有意识地使用 idxmax/idxmin 而非已弃用的 argmax/argmin。

—— 小象教研组

配套资料 · 直接下载

课件、代码、数据集等配套资料全部免费,点击即可直接下载,无需分享或解锁。

  • 本节课件:常用统计方法(3) -- max min idxmax idxmin
    PDF · 177KB
    下载
  • 全套课件打包(第1-5章)
    ZIP · 12.8MB
    下载
  • 全套课件打包(第6-8章)
    ZIP · 15MB
    下载
  • 实战数据集:AppleStore 应用商城分析
    ZIP · 329KB
    下载
  • 实战数据集:女性服装电商分析
    ZIP · 2.8MB
    下载
  • Python 数据分析环境搭建指南
    PDF · 2MB
    下载
  • Scrapy 安装教程
    PDF · 12.7MB
    下载
  • 附加实战项目:AppleStore 应用商城数据分析
    ZIP · 0.3MB · ipynb + CSV 数据
    下载
  • 附加实战项目:银行电话营销数据分析
    ZIP · 0.4MB · ipynb + CSV 数据
    下载
  • 附加实战项目:女性服装电商评论数据分析
    ZIP · 2.7MB · ipynb + CSV 数据
    下载
  • 附加实战项目:美国化学学会杂志数据分析
    ZIP · 34.2MB · ipynb + SQLite 数据库
    下载