使用 idxmax() 和 idxmin() 方法获取 pandas.DataFrame 和 pandas.Series 中每列和行的最大值和最小值元素的行名和列名。
pandas.DataFrame 和 pandas.Series 都有 idxmax() 和 idxmin() 方法。
在此对以下内容进行说明。
注意,行号和列号可以从行名和列名中获得。请参阅下面的文章。
以下面的 pandas.DataFrame 为例。选择一列并将其用作 pandas.Series 的示例。
import pandas as pd
df = pd.DataFrame({'col1': [0, 3, 2, 3], 'col2': [4, 0, 2, 1]},
index=['a', 'b', 'c', 'd'])
print(df)
# col1 col2
# a 0 4
# b 3 0
# c 2 2
# d 3 1
print(df['col1'])
# a 0
# b 3
# c 2
# d 3
# Name: col1, dtype: int64
print(type(df['col1']))
#
如果想自己获取最大值和最小值,可以使用max()和min()方法。
pandas.Series 的示例。
print(df['col1'])
# a 0
# b 3
# c 2
# d 3
# Name: col1, dtype: int64
可以使用max()和min()方法获得最大值和最小值。
print(df['col1'].max())
# 3
print(df['col1'].min())
# 0
pandas.DataFrame 的示例。
print(df)
# col1 col2
# a 0 4
# b 3 0
# c 2 2
# d 3 1
默认情况下可以获得每列的最大值和最小值。
print(df.max())
# col1 3
# col2 4
# dtype: int64
print(df.min())
# col1 0
# col2 0
# dtype: int64
如果设置参数axis=1,则可以获得每一行的最大值和最小值。
print(df.max(axis=1))
# a 4
# b 3
# c 2
# d 3
# dtype: int64
print(df.min(axis=1))
# a 0
# b 0
# c 2
# d 1
# dtype: int64
无论哪种情况,返回类型都是 pandas.Series。
print(type(df.max()))
#
pandas.Series 的示例。
print(df['col1'])
# a 0
# b 3
# c 2
# d 3
# Name: col1, dtype: int64
利用pandas.Series的idxmax()和idxmin(),可以获得最大值和最小值元素的索引(标签)。如果有多个最大值和最小值,则仅返回第一个元素的索引。
print(df['col1'].idxmax())
# b
print(df['col1'].idxmin())
# a
如果有多个最大/最小值并且想要检索所有索引,请使用布尔索引引用提取等于最大/最小值的元素并检索索引属性。
print(df['col1'] == df['col1'].max())
# a False
# b True
# c False
# d True
# Name: col1, dtype: bool
print(df['col1'][df['col1'] == df['col1'].max()])
# b 3
# d 3
# Name: col1, dtype: int64
print(df['col1'][df['col1'] == df['col1'].max()].index)
# Index(['b', 'd'], dtype='object')
可以通过index的values属性得到NumPy数组numpy.ndarray,通过list()得到Python标准列表类型。
print(df['col1'][df['col1'] == df['col1'].max()].index.values)
# ['b' 'd']
print(type(df['col1'][df['col1'] == df['col1'].max()].index.values))
#
print(list(df['col1'][df['col1'] == df['col1'].max()].index))
# ['b', 'd']
print(type(list(df['col1'][df['col1'] == df['col1'].max()].index)))
#
如果对只有一个最大值和一个最小值的 pandas.Series 执行相同的过程,它将变成一个 numpy.ndarray 或包含一个元素的列表。
print(df['col1'][df['col1'] == df['col1'].min()].index.values)
# ['a']
使用 loc 或 iloc 提取 pandas.DataFrame 的行。
print(df.loc['a'])
# col1 0
# col2 4
# Name: a, dtype: int64
print(df.loc['a'].idxmax())
# col2
print(df.loc['a'].idxmin())
# col1
pandas.DataFrame 的示例。
print(df)
# col1 col2
# a 0 4
# b 3 0
# c 2 2
# d 3 1
默认情况下,每列的最大值和最小值元素的行名可以通过pandas.Series获取。同样,如果有多个最大值和最小值,则仅返回第一个元素的索引。
print(df.idxmax())
# col1 b
# col2 a
# dtype: object
print(df.idxmin())
# col1 a
# col2 b
# dtype: object
如果执行与上面 pandas.Series 中相同的过程,使用 apply() 方法将函数应用于每一列,则可以获得每列中具有最大值和最小值的元素的行名称,如 numpy.ndarray或列出。使用匿名函数(lambda 表达式)。
print(df.apply(lambda x: list(x[x == x.max()].index)))
# col1 [b, d]
# col2 [a]
# dtype: object
print(df.apply(lambda x: list(x[x == x.min()].index)))
# col1 [a]
# col2 [b]
# dtype: object
如果idxmax()和idxmin()方法的参数axis=1,则可以获取每行的最大值和最小值元素的列名,即pandas.Series。
print(df.idxmax(axis=1))
# a col2
# b col1
# c col1
# d col1
# dtype: object
print(df.idxmin(axis=1))
# a col1
# b col2
# c col1
# d col2
# dtype: object
即使在 apply() 方法中,如果设置参数 axis=1,它也会处理该行。
print(df.apply(lambda x: list(x[x == x.max()].index), axis=1))
# a [col2]
# b [col1]
# c [col1, col2]
# d [col1]
# dtype: object
print(df.apply(lambda x: list(x[x == x.min()].index), axis=1))
# a [col1]
# b [col2]
# c [col1, col2]
# d [col2]
# dtype: object
例如,创建一个包含缺失值 NaN 的 pandas.DataFrame。
df_nan = df.copy()
df_nan.at['b'] = pd.np.nan
print(df_nan)
# col1 col2
# a 0.0 4.0
# b NaN NaN
# c 2.0 2.0
# d 3.0 1.0
在idxmax()和idxmin()中,缺失值NaN默认被排除并处理。但是,所有元素均为 NaN 的列或行将导致 NaN。
print(df_nan.idxmax())
# col1 d
# col2 a
# dtype: object
print(df_nan.idxmin())
# col1 a
# col2 d
# dtype: object
print(df_nan.idxmax(axis=1))
# a col2
# b NaN
# c col1
# d col1
# dtype: object
print(df_nan.idxmin(axis=1))
# a col1
# b NaN
# c col1
# d col2
# dtype: object
如果参数skipna=False,则不会排除NaN。在这种情况下,包含 NaN 的行/列的结果在 idxmax() 和 idxmin() 中都将为 NaN。
print(df_nan.idxmax(skipna=False))
# col1 NaN
# col2 NaN
# dtype: float64
print(df_nan.idxmin(skipna=False))
# col1 NaN
# col2 NaN
# dtype: float64
print(df_nan.idxmax(axis=1, skipna=False))
# a col2
# b NaN
# c col1
# d col1
# dtype: object
print(df_nan.idxmin(axis=1, skipna=False))
# a col1
# b NaN
# c col1
# d col2
# dtype: object
pandas.Series 也是如此。
print(df_nan['col1'].idxmax())
# d
print(df_nan['col1'].idxmin())
# a
print(df_nan['col1'].idxmax(skipna=False))
# nan
print(df_nan['col1'].idxmin(skipna=False))
# nan