70_Pandas中获取最大最小值的行名和列名

70_Pandas中获取最大最小值的行名和列名

使用 idxmax() 和 idxmin() 方法获取 pandas.DataFrame 和 pandas.Series 中每列和行的最大值和最小值元素的行名和列名。

pandas.DataFrame 和 pandas.Series 都有 idxmax() 和 idxmin() 方法。
在此对以下内容进行说明。

  • 获取最大值和最小值:max()、min()
  • 获取最大/最小值的行名/列名:idxmax()、idxmin()
  • 处理缺失值NaN

注意,行号和列号可以从行名和列名中获得。请参阅下面的文章。

  • 69_Pandas.DataFrame获取行号和列号

以下面的 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()

如果想自己获取最大值和最小值,可以使用max()和min()方法。

pandas.Series

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

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()))
# 

获取最大/最小值的行名/列名:idxmax()、idxmin()

pandas.Series

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 的行。

  • 04_Pandas获取和修改任意位置的值(at,iat,loc,iloc)
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

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 表达式)。

  • 06_Pandas中map(),applymap(),apply()函数的使用方法
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

例如,创建一个包含缺失值 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

你可能感兴趣的:(Pandas,pandas,python,数据分析,机器学习,人工智能)