pandasで最大値・最小値の行名・列名を取得するidxmax, idxmin
pandas.DataFrame
, pandas.Series
で各列・各行の最大値・最小値である要素の行名・列名を取得するにはidxmax()
, idxmin()
メソッドを使う。
pandas.DataFrame
, pandas.Series
それぞれにidxmax()
, idxmin()
メソッドがある。
- pandas.Series.idxmax — pandas 0.23.3 documentation
- pandas.DataFrame.idxmax — pandas 0.23.3 documentation
- pandas.Series.idxmin — pandas 0.23.3 documentation
- pandas.DataFrame.idxmin — pandas 0.23.3 documentation
pandas.Series
にはargmax()
, argmin()
メソッドもあるがバージョン0.21.0
からDeprecated(非推奨)となっている。
- pandas.Series.argmax — pandas 0.23.3 documentation
- pandas.Series.argmin — pandas 0.23.3 documentation
ここでは以下の内容について説明する。
- 最大値・最小値を取得:
max()
,min()
- 最大値・最小値の行名・列名を取得:
idxmax()
,idxmin()
- 欠損値
NaN
の扱い
なお、行番号・列番号は行名・列名から取得することができる。以下の記事を参照。
以下のpandas.DataFrame
を例とする。1列を選択したものを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']))
# <class 'pandas.core.series.Series'>
最大値・最小値を取得: 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()))
# <class 'pandas.core.series.Series'>
最大値・最小値の行名・列名を取得: 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
最大値・最小値が複数ある場合にすべてのインデックスを取得したい場合は、最大値・最小値に等しい要素をブールインデックス参照で抽出し、index
属性を取得する。
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標準のlist
型を取得できる。
print(df['col1'][df['col1'] == df['col1'].max()].index.values)
# ['b' 'd']
print(type(df['col1'][df['col1'] == df['col1'].max()].index.values))
# <class 'numpy.ndarray'>
print(list(df['col1'][df['col1'] == df['col1'].max()].index))
# ['b', 'd']
print(type(list(df['col1'][df['col1'] == df['col1'].max()].index)))
# <class 'list'>
同様の処理を最大値・最小値が1個だけのpandas.Series
に対して行うと要素が1個のnumpy.ndarray
やlist
となる。
print(df['col1'][df['col1'] == df['col1'].min()].index.values)
# ['a']
pandas.DataFrame
の行を抽出する場合は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
各列に関数を適用するapply()
メソッドで上述のpandas.Series
と同様の処理を行えば、各列の最大値・最小値の要素の行名をnumpy.ndarray
やlist
として取得可能。無名関数(ラムダ式)を使っている。
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
pandas.Series
の要素としてnumpy.ndarray
やlist
が格納されている場合の処理の方法などは以下の記事を参照。len()
で個数を取得したりできる。
- 関連記事: pandasの要素としてリストを格納し処理
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