YutaKaのPython教室

Python の文法やライブラリ、API、環境構築について画像・動画・ソースコード付きで徹底解説!

pandas 最大値・最小値を抽出|図解でわかるmax min idxmax idxmin

pandasDataFrameで最大値・最小値を検索する方法を紹介します。

pandasには、便利な機能がたくさんありますが、初めはちょっとした操作も難しいものです。

例えば、次のような処理で困ってしまうことも:

  • 行・列の最大値・最小値はどうやって取得すればいいの?
  • 最大値・最小値が、どの行・列にあるか知りたい!

そこで、この記事では次の内容をわかりやすい図解付きで解説していきます:

  • 各行・列の最大値・最小値を取得
  • 最大値・最小値の行・列を取得
  • n番目に大きい・小さい値を取得

最大値・最小値関連の処理の基本を覚えて、pandasマスターを目指しましょう!

 

最大値・最小値関連のメソッドまとめ

DataFrameの最大値・最小値関連のメソッドを下表に整理しています。

操作内容 最大値 最小値 行方向で集計する方法
統計値をまとめて出力 df. describe()の出力の一部 df. describe()の出力の一部 dfを転置後実行
df.T.describe()
最大値・最小値を出力 df.max() df.min() 引数でaxis=1を指定
最大値・最小値位置のラベル名を出力 df.idxmax() df.idxmin() 引数でaxis=1を指定
n番目に大きい・小さい値 df[列名].nlargest(n) df[列名].nsmallest(n) df.loc[行名]で行を抽出後実行
df.loc[行名].nlargest(n)

デフォルトでは、最大値・最小値のメソッドはDataFrameの各列に対して実行されます。

各行の最大値・最小値を確認したい場合には、転置したり、引数でaxis=1を指定したりします。

以下では、次のDataFrameを例にして、各メソッドをより詳しく解説していきます。

import pandas as pd
import numpy as np
data = {"Data0":[1, 6, 8, np.nan],
        "Data1":[4, 2, 7, np.nan],
        "Data2":[9, 5, 3, np.nan], }
 
df = pd.DataFrame(data, index = pd.Index(["Ind0", "Ind1", "Ind2", "Ind3"], name="Ind"))

最終行に欠損値NaNを仕込んでいるのは、欠損値の処理も確認するためです。

DataFrameの統計値をまとめて出力|df.describe()

df.describe()メソッドを使用すると、列毎の基本統計量がDataFrameで出力されます。

出力される基本統計量一覧は次の通りです:

ラベル名 内容
count データ数
mean 平均値
std 標準偏差
max 最大値
75% 75パーセンタイル
50% 50パーセンタイル(中央値)
25% 25パーセンタイル
min 最小値

この中に最大値・最小値も含まれているので、簡易的に確認する際にはdf.describe()も便利です。

基本統計量の計算時、欠損値は無視されます。

df.describe()

上手の結果のように、デフォルトでは行方向で集計されます。

列方向に集計したい場合には、df.Tで転置してからdescribe()メソッドを使用します。

df.T.describe()

最大値・最小値を取得

各行の最大値・最小値を取得したい場合には、df.max(), df.min()メソッドを使用します。

デフォルトでは、行方向に最大値・最小値を集計します。

列方向に集計したい場合には、引数axis=1を指定します。

  最大値 最小値
行方向 df.max() df.min()
列方向 df.max(axis=1) df.min(axis=1)

結果はSeriesで出力されます。

df.max()を例にサンプルコードを紹介します。df.min()も同様です。

# デフォルトでは行方向に探索
df.max()
# 出力結果:Series
#
# Data0    8.0
# Data1    7.0
# Data2    9.0
# dtype: float64
 
# axis=1で、列方向に探索
df.max(axis=1)
# 出力結果:Series
#
# Ind
# Ind0    9.0
# Ind1    6.0
# Ind2    8.0
# Ind3    NaN
# dtype: float64

デフォルトでは、欠損値を除外して、最大値・最小値を評価します。

ただしInd3行のように、全てのデータが欠損の場合には欠損値が出力されます。

最大値・最小値の行・列を取得

各行の最大値・最小値を取得したい場合には、df.idxmax(), df.idxmin()メソッドを使用します。

デフォルトでは、行方向に最大値・最小値の探索し、その行のインデックス名を集計します。

idxindexの略称です。

列方向に集計したい場合には、引数axis=1を指定します。

  最大値のラベル 最小値のラベル
行方向 df.idxmax() df.idxmin()
列方向 df.idxmax(axis=1) df.idxmin(axis=1)

結果はSeriesで出力されます。

df.idxmax()を例にサンプルコードを紹介します。df.idxmin()も同様です。

# デフォルトでは行方向に探索
df.idxmax()
# 出力結果:Series
#
# Data0    Ind2
# Data1    Ind2
# Data2    Ind0
# dtype: object
 
# axis=1で、列方向に探索
df.idxmax(axis=1)
# 出力結果:Series
#
# Ind
# Ind0    Data2
# Ind1    Data0
# Ind2    Data0
# Ind3      NaN
# dtype: object

デフォルトでは、欠損値を除外して、最大値・最小値を評価します。

ただしInd3行のように、全てのデータが欠損の場合には欠損値が出力されます。

【トラブル事例】最大値・最小値が複数ある場合の対応

最大値・最小値が重複している場合、df.idxmax(), df.idxmin()は、一番上の行名のみを返します。

次のDataFrameを例に挙動を確認してみます。

df.idxmax()
# 出力結果
# Data0    Ind0
# Data1    Ind1
# Data2    Ind2
# dtype: object

例えば、"Data0"列は"Ind0""Ind2"の2行が最大値にも関わらず、"Ind0"しか返されていません。

こういった場合は、素直に各列の最大値・最小値を検索して、行名を出力すると良いです。

実際に"Data0"列の最大値行名を出力してみます。

df.loc[ df["Data0"] == df["Data0"].max(), :].index.tolist()
# ['Ind0', 'Ind2']

上の方法では、次の処理を一行で記述しています。

  1. 最大値の値を取得|df["列名"].max()
  2. 値が最大値と一致する行を抽出|df.loc[ df["列名" == df["列名"].max(), :]
  3. インデックスをリスト化|df.loc[ df["列名"] == df["列名"].max(), :] .index.tolist()

こういったデータ探索とインデックス操作の合わせ技ができるとpandasが楽しくなってきます。

インデックス操作は次の記事でも解説しています。

≫pandas インデックスの基本操作|要素にアクセス、
≫pandas インデックスの基本操作|要素にアクセス、
pandasのDataFrameでは、インデックス名やカラム名を使ってデータにアクセスしますね。しかし、インデックスやコラムの操作は少しわかりにくい部分も…。そこで、この記事では①インデックスの基本構造②インデックス内要素へのアクセス方法③基本的なインデックス操作(データ探索、並べ替え、重複処理、欠損値処理)をサンプルコード付きでわかりやすく解説!
www.yutaka-note.com/entry/pandas_index_manip
 

n番目に大きい・小さい値を取得

特定の行・列を指定してnlargest(), nsmallest()メソッドを使用すると便利です。

  • 大きい方からn番目まで出力:df[columns].nlargest(n)
  • 小さい方からn番目まで出力:df[columns].nsmallest(n)

それぞれcolumns列を降順/昇順にソートして、上からn個のデータを返します。

df["Data0"].nlargest(3)
# 出力結果
# Ind
# Ind2    8.0
# Ind1    6.0
# Ind0    1.0
# Name: Data0, dtype: float64
 
df["Data0"].nsmallest(3)
# 出力結果
# Ind
# Ind0    1.0
# Ind1    6.0
# Ind2    8.0
# Name: Data0, dtype: float64

n番目の値のみを取得したい場合には、インデックスで[-1]を指定すればOKです。

n = 3
# n番目に大きい値
df["Data0"].nlargest(3)[-1]
# 1.0
# n番目に小さい値
df["Data0"].nsmallest(n)[-1]
# 8.0

行方向に探索したい場合は、df.loc[]で行を指定してnlargest(), nsmallest()メソッドを使用すれば良いですね。

n = 3
df.loc["Ind0"].nlargest(n)[-1]
# 4.0
df.loc["Ind0"].nsmallest(n)[-1]
# 9.0

おわりに|padans関連おススメ追加コンテンツ

今回はpandas の最大値・最小値関連のメソッドについて紹介しました。

pandasは便利すぎて操作方法がわかりにくいことがよくあります…。

結局はコツコツ学ぶのが、pandasマスターの近道ですよね!≫【ブログカテゴリー:pandas】

≫【レビュー】「Pythonによるデータ分析入門」| pandas開発者によるpandasユーザーのためのpandasの教科書!
≫【レビュー】「Pythonによるデータ分析入門」| pandas開発者によるpandasユーザーのためのpandasの教科書!
「Pythonによるデータ分析入門」を、最初から最後まで実際に実践してみたレビューです。具体的にどのようなことができるようになったかを実例付きで紹介します!・DataFrameの生成方法・欠損値の処理方法・グラフ化の方法気になる学習時間は…?
www.yutaka-note.com/entry/2019/12/07/230219
 
≫pandas DataFrameの行・列を抽出|loc, ilocなどわかりやすく解説!
≫pandas DataFrameの行・列を抽出|loc, ilocなどわかりやすく解説!
pandasのDataFrameを使うと、行と列で構成されたデータを簡単に取り扱うことができます。この記事では、「DataFrameの特定の行、列のデータを抽出する方法」、「インデックス参照、.loc、.iloc、at、iat[]の使い方」をわかりやすい図解付きで解説しています。
www.yutaka-note.com/entry/pandas_access
 
≫pandas リストからDataFrameを生成|インデックスとコラムの設定も!
≫pandas リストからDataFrameを生成|インデックスとコラムの設定も!
pandasでは、リストからデータフレームを生成することもできます。しかし、pandasの操作に慣れていないうちは、ちょっとした操作も難しいですよね。この記事では、①リストからデータフレームを生成、行と列を追加する方法、②インデックス名、コラム名を設定する方法、③DataFrameを転値する方法(行と列が期待と逆だった時の対応)をサンプルコード付きで紹介!
www.yutaka-note.com/entry/pandas_list
 
≫pandas 辞書型からDataFrameを生成|インデックスとコラムの設定も!
≫pandas 辞書型からDataFrameを生成|インデックスとコラムの設定も!
pandasでは、辞書型からデータフレームを生成することもできます。しかし、pandasの操作に慣れていないうちは、ちょっとした操作も難しいですよね。この記事では、①辞書型からデータフレームを生成する方法、②辞書のキーをインデックス名、コラム名それぞれに設定する方法、③DataFrame()とDataFrame.from_dict()の違いをサンプルコード付きで紹介!
www.yutaka-note.com/entry/pandas_dict
 
≫pandas インデックス名の設定・変更|パターン別にわかりやすく解説
≫pandas インデックス名の設定・変更|パターン別にわかりやすく解説
pandasのDataFrameでは、インデックス名やカラム名を使ってデータにアクセスしますね。しかし、インデックスやコラムの操作は少しわかりにくい部分も…。そこで、この記事では①インデックスの基本的な設定方法、変更方法、②インデックス番号のリセット方法をサンプルコード付きでわかりやすく解説!
www.yutaka-note.com/entry/pandas_index_setting
 
≫pandas インデックスの基本操作|要素にアクセス、
≫pandas インデックスの基本操作|要素にアクセス、
pandasのDataFrameでは、インデックス名やカラム名を使ってデータにアクセスしますね。しかし、インデックスやコラムの操作は少しわかりにくい部分も…。そこで、この記事では①インデックスの基本構造②インデックス内要素へのアクセス方法③基本的なインデックス操作(データ探索、並べ替え、重複処理、欠損値処理)をサンプルコード付きでわかりやすく解説!
www.yutaka-note.com/entry/pandas_index_manip
 
≫pandas | read_excel() 図解でわかりやすく解説!
≫pandas | read_excel() 図解でわかりやすく解説!
pandasで、excelファイルを読み込むための関数read_excel()について、図解で徹底解説!①表のデータがセルA1から始まっていないときの対応方法②indexやlabelの行や列を指定する方法
www.yutaka-note.com/entry/pandas_read_excel_1
 
≫pandas | read_csv() 図解でわかりやすく解説!
≫pandas | read_csv() 図解でわかりやすく解説!
pandasでcsvファイルを読み込むための関数read_csv()について、図解で徹底解説! ①区切り文字の指定②indexやlabelの行や列を指定する方法③読み込む行・列の指定など細かい設定についての解説記事です!
www.yutaka-note.com/entry/pandas_read_csv
 
≫【レビュー】「Python実践データ分析100本ノック」|100本終えたらpandasが好きになっていた
≫【レビュー】「Python実践データ分析100本ノック」|100本終えたらpandasが好きになっていた
Python実践データ分析100本ノックで、実際に100本終了したレビューです。pythonでのデータ分析の入門書としてかなりの良書だったと思います。・python2~3冊目に何を勉強しようか迷っている人・時間をかけずにデータ分析の基本を学びたい人・pandasへの抵抗を減らしたい人
www.yutaka-note.com/entry/nock_100
 
≫pandas|head(), tail()でデータ先頭, 末尾を抽出!
≫pandas|head(), tail()でデータ先頭, 末尾を抽出!
pandasのDataFrameやSeriesで先頭や末尾の数行をさっと確認したい場合には、head()、tail()メソッドを使用します。引数で表示する行数を指定することもできますので、その使用方法を解説していきます。
www.yutaka-note.com/entry/pandas_head_tail
 

Twitter@YutaKaでは、ほぼ毎日pythonに関する情報を発信しています。

気楽にツイートしているので、気軽にフォローしてください!