`idxmax()`

298 阅读3分钟

idxmax() 是 Pandas 中的一个函数,用于返回给定列或行中的最大值的 索引。它通常用于查找数据集中最大值所在的行或列的标签。

idxmax() 方法概述

  • 功能:返回 Series 或 DataFrame 中最大值所在的 索引标签
  • 返回值:返回最大值的 索引位置,通常是行标签(如果操作的是列)或列标签(如果操作的是行)。

基本语法

Series.idxmax(axis=0, skipna=True, *args, **kwargs)
DataFrame.idxmax(axis=0, skipna=True, *args, **kwargs)
  • axis:指定沿哪个轴进行计算,默认为 0,表示按列(沿着行索引)查找最大值。如果为 1,则按行查找最大值(沿着列索引)。
  • skipna:是否跳过缺失值(NaN)。默认值是 True,表示跳过缺失值。如果为 False,在包含缺失值的情况下会返回 NaN。

1. 在 Series 中使用 idxmax()

idxmax() 返回的是 最大值所在的索引

示例:

import pandas as pd

s = pd.Series([3, 7, 1, 5, 9])

# 查找最大值的索引
index_of_max = s.idxmax()
print(index_of_max)  # 输出 4

解释:Series 中的最大值是 9,它位于索引 4 位置,因此 idxmax() 返回 4

2. 在 DataFrame 中使用 idxmax()

在 DataFrame 中,idxmax() 可以按列或按行进行操作。默认情况下,它会沿着 查找每列的最大值,并返回每列最大值的索引。

示例:

import pandas as pd

df = pd.DataFrame({
    'A': [1, 3, 2, 5],
    'B': [6, 4, 8, 2],
    'C': [9, 7, 4, 1]
})

# 按列查找最大值的索引
index_of_max_in_A = df['A'].idxmax()
print(index_of_max_in_A)  # 输出 3

# 在整个 DataFrame 中查找每列的最大值的索引
index_of_max_per_column = df.idxmax()
print(index_of_max_per_column)

输出

A    3
B    2
C    0
dtype: int64

解释

  • 对于列 A,最大值 5 在索引位置 3
  • 对于列 B,最大值 8 在索引位置 2
  • 对于列 C,最大值 9 在索引位置 0

axis=1 参数:按行查找最大值的索引

如果想要按行查找每行最大值的索引,可以指定 axis=1

# 按行查找最大值的索引
index_of_max_per_row = df.idxmax(axis=1)
print(index_of_max_per_row)

输出

0    C
1    A
2    B
3    A
dtype: object

解释

  • 第 0 行最大值是 9,出现在列 C
  • 第 1 行最大值是 3,出现在列 A
  • 第 2 行最大值是 8,出现在列 B
  • 第 3 行最大值是 5,出现在列 A

3. skipna 参数

  • skipna=True:忽略 NaN 值,默认行为。
  • skipna=False:如果数据中包含 NaN,则返回 NaN

示例:

s = pd.Series([3, 7, None, 5, 9])

# 忽略 NaN,查找最大值的索引
index_of_max_skipna = s.idxmax(skipna=True)
print(index_of_max_skipna)  # 输出 4

# 不忽略 NaN,查找最大值的索引
index_of_max_no_skipna = s.idxmax(skipna=False)
print(index_of_max_no_skipna)  # 输出 NaN

解释

  • skipna=True 的情况下,None 被忽略,最大值 9 的索引是 4
  • skipna=False 的情况下,由于 NaN 存在,idxmax() 返回 NaN

4. 用 idxmax() 结合 groupby() 进行分组操作

idxmax() 也常用于与 groupby() 配合,按分组计算每组的最大值索引。

示例:

df = pd.DataFrame({
    'modelCode': ['A', 'A', 'A', 'B', 'B', 'B'],
    'channelCode': ['X', 'X', 'Y', 'X', 'X', 'Y'],
    'period': [202301, 202302, 202303, 202304, 202305, 202306],
    'url': ['url1.com', 'url2.com', 'url3.com', 'url4.com', 'url5.com', 'url6.com']
})

# 对 ('modelCode', 'channelCode') 进行分组,找到每组 'period' 最大值的索引
result = df.loc[df.groupby(['modelCode', 'channelCode'])['period'].idxmax(), ['modelCode', 'channelCode', 'url']]
print(result)

输出

  modelCode channelCode        url
1         A           X    url2.com
2         A           Y    url3.com
4         B           X    url5.com
5         B           Y    url6.com

解释

  • 对于每个 (modelCode, channelCode) 组合,idxmax() 找到 period 列最大值的索引,然后使用 loc 获取这些行。
  • 结果是每个 (modelCode, channelCode) 组中 period 最大的行,并返回相关的 modelCodechannelCodeurl

总结

  • idxmax() 是 Pandas 中用来返回 Series 或 DataFrame 中最大值的索引的位置。
  • Series 中,返回最大值的索引。
  • DataFrame 中,返回每列或每行最大值的索引,可以通过 axis 参数控制。
  • 可以与 groupby() 配合,按分组计算每组的最大值索引。
  • skipna 参数控制是否忽略 NaN 值。

idxmax() 适用于快速定位数据集中的最大值索引,是处理数据时常用的一个工具。