【Pandasデータ探索】idxmax()とidxmin()で最大・最小値の「位置」を特定! 🎯


 

データ分析において、DataFrameやSeriesの中から最大値(最小値)がどこにあるのか、つまりその値が属する**行の名前(インデックス)列の名前(カラム名)**を知りたい場面は非常に頻繁に発生します。例えば、「最も売上が高かった商品のID」や「最も温度が低かった日の日付」といった情報を素早く特定したい場合に役立ちます。

Pandasの**idxmax()メソッドとidxmin()**メソッドは、このようなニーズにまさに応える強力なツールです。これらは、データセットにおける最大値または最小値のインデックス(または列名)を効率的に取得するための機能を提供します。この記事では、idxmax()idxmin()の基本的な使い方から、知っておくと便利な応用例まで、短いサンプルコードと丁寧な解説を交えてご紹介します。


 

idxmax()idxmin()とは?なぜ最大・最小値の位置が必要なのか?

 

  • idxmax(): SeriesまたはDataFrameにおいて、**最大値が出現する最初のインデックス(行名または列名)**を返します。

  • idxmin(): SeriesまたはDataFrameにおいて、**最小値が出現する最初のインデックス(行名または列名)**を返します。

なぜ最大値・最小値の「位置」が必要なのでしょうか?

  • 異常値の特定: 異常に高い値や低い値が見つかったときに、それがどのデータポイントに該当するのかを特定できます。

  • ランキング分析: 特定の指標で最もパフォーマンスの高い(低い)エンティティ(例: 製品、店舗、顧客)を識別できます。

  • 特定の条件下のデータ抽出: 最大値や最小値を持つデータポイントの他の属性(例: 最大売上の日、その日の商品カテゴリ)を追跡・分析する際の足がかりとなります。

  • 効率的なデータ探索: max()min()で値自体は分かっても、その値がどこから来たのかを即座に知るのに役立ちます。


 

1. Seriesで最大・最小値のインデックスを取得

 

Seriesに対してidxmax()idxmin()を適用すると、そのSeries内で最大値(最小値)を持つ要素のインデックスを返します。

 

基本的な使い方

 

Python
 
import pandas as pd
import numpy as np

# サンプルSeriesの作成
s_scores = pd.Series([85, 92, 78, 95, 88], index=['Aさん', 'Bさん', 'Cさん', 'Dさん', 'Eさん'])
print("元のSeries (スコア):\n", s_scores)

# 最大値のインデックスを取得
max_score_person = s_scores.idxmax()
print(f"\n最高スコアの人物: {max_score_person}")

# 最小値のインデックスを取得
min_score_person = s_scores.idxmin()
print(f"最低スコアの人物: {min_score_person}")

解説:

  1. s_scores.idxmax(): Series s_scoresの中で最も高い値(95)を持つインデックスである'Dさん'を返します。

  2. s_scores.idxmin(): Series s_scoresの中で最も低い値(78)を持つインデックスである'Cさん'を返します。


 

2. DataFrameで最大・最小値のインデックス/カラム名を取得

 

DataFrameに対してidxmax()idxmin()を適用すると、デフォルトでは列ごとに最大値(最小値)のインデックスを返します。axis引数を変更することで、行ごとに最大値(最小値)を持つ列名を取得することも可能です。

 

列ごとの最大値/最小値のインデックスを取得 (axis=0 またはデフォルト)

 

DataFrameの各列において、最大値(最小値)がどの行にあるかを知りたい場合に利用します。

Python
 
# サンプルDataFrameの作成
df_sales = pd.DataFrame({
    '東京': [100, 150, 80, 200, 120],
    '大阪': [110, 160, 90, 180, 130],
    '福岡': [95, 140, 75, 190, 115]
}, index=['月_1', '月_2', '月_3', '月_4', '月_5'])
print("\n元のDataFrame (月別支店売上):\n", df_sales)

# 各支店(列)で最も売上が高かった月(行インデックス)を取得
max_sales_month_per_branch = df_sales.idxmax()
print("\n各支店で最高売上だった月:\n", max_sales_month_per_branch)

# 各支店(列)で最も売上が低かった月(行インデックス)を取得
min_sales_month_per_branch = df_sales.idxmin()
print("\n各支店で最低売上だった月:\n", min_sales_month_per_branch)

解説:

  • df_sales.idxmax(): 各列('東京', '大阪', '福岡')の中で最大値を持つ行のインデックスを返します。例えば'東京'列の最大値200'月_4'にあります。

  • axis=0がデフォルトで、これは「列方向に操作を行い、行インデックスを返す」ことを意味します。

 

行ごとの最大値/最小値の列名を取得 (axis=1)

 

各行(例えば各月)において、どの列(例えばどの支店)が最大値(最小値)だったかを知りたい場合に利用します。

Python
 
# 各月(行)で最も売上が高かった支店(列名)を取得
max_sales_branch_per_month = df_sales.idxmax(axis=1)
print("\n各月で最高売上だった支店:\n", max_sales_branch_per_month)

# 各月(行)で最も売上が低かった支店(列名)を取得
min_sales_branch_per_month = df_sales.idxmin(axis=1)
print("\n各月で最低売上だった支店:\n", min_sales_branch_per_month)

解説:

  • df_sales.idxmax(axis=1): 各行において、最大値を持つ列の列名を返します。例えば'月_1'行の最大値110'大阪'列にあります。

  • axis=1は「行方向に操作を行い、列名を返す」ことを意味します。


 

3. 複数の最大値/最小値が存在する場合の動作

 

idxmax()およびidxmin()は、デフォルトでは最初に現れる最大値(最小値)のインデックスを返します。

Python
 
# 複数の最大値があるSeries
s_multi_max = pd.Series([10, 20, 15, 20, 5], index=['A', 'B', 'C', 'D', 'E'])
print("\n複数の最大値があるSeries:\n", s_multi_max)

# 最初の最大値のインデックスを返す
first_idxmax = s_multi_max.idxmax()
print(f"最初の最大値のインデックス: {first_idxmax}") # 'B'が返される

# 複数の最小値があるDataFrame
df_multi_min = pd.DataFrame({
    'X': [10, 5, 20],
    'Y': [5, 15, 25]
}, index=['R1', 'R2', 'R3'])
print("\n複数の最小値があるDataFrame:\n", df_multi_min)

# 各列で最初の最小値のインデックスを返す
first_idxmin_df = df_multi_min.idxmin()
print("\n各列の最初の最小値のインデックス:\n", first_idxmin_df) # 'X'列では'R2'、'Y'列では'R1'

解説:

s_multi_maxでは20が’B’と’D’の両方にありますが、idxmax()は最初に現れる’B’を返します。この挙動は、特定の条件下で最初の出現位置が重要な場合に役立ちます。


 

4. 欠損値(NaN)の扱い

 

idxmax()およびidxmin()は、デフォルトで欠損値(NaN)を無視して計算を行います。

Python
 
s_nan = pd.Series([10, np.nan, 20, 5])
print("\nNaNを含むSeries:\n", s_nan)

idxmax_nan = s_nan.idxmax()
idxmin_nan = s_nan.idxmin()
print(f"NaNを含むSeriesの最大値インデックス: {idxmax_nan}")
print(f"NaNを含むSeriesの最小値インデックス: {idxmin_nan}")

解説:

NaNはスキップされ、残りの非NaN値の中で最大値(最小値)が計算されます。


 

まとめ

 

Pandasのidxmax()idxmin()メソッドは、DataFrameやSeries内の数値データから、最大値または最小値がどこにあるのかを特定するための非常に強力なツールです。Seriesではそのインデックスを、DataFrameではaxis引数を使って行インデックスまたは列名としてその位置を効率的に取得できます。

これにより、データの異常値特定、ランキング分析、特定の条件下のデータ抽出など、多岐にわたるデータ探索と分析のタスクが格段にスムーズになります。これらのメソッドをマスターし、あなたのデータ分析の洞察力をさらに高めましょう!