Pythonのidxmaxとは?最大値のインデックスを取得する方法をわかりやすく解説

Pythonでデータ分析をしていると、「最大値が入っている場所を取得したい」という場面があります。
特にPandasを使っている場合は、idxmax()を利用すると、最大値そのものではなく、最大値を持つ行や列のインデックスを簡単に取得できます。
この記事では、Pythonのidxmax()について、基本的な使い方から、DataFrameでの利用方法、max()との違い、複数の最大値がある場合の挙動まで、サンプルコードを使って詳しく解説します。
Pythonのidxmaxとは?
idxmax()は、PandasのSeriesやDataFrameで利用できるメソッドです。
最大値を持つ要素のインデックスを返します。
例えば、次のようなデータがあるとします。
import pandas as pd
s = pd.Series([10, 30, 20, 50, 40])
print(s.idxmax())
実行結果は次のようになります。
3
最大値は50で、その最大値が存在するインデックスが3だからです。
つまり、
値 10 30 20 50 40
index 0 1 2 3 4
↑
最大値
となります。
idxmax()の基本構文
Seriesの場合、基本的な構文は次のとおりです。
Series.idxmax()
主なポイントは、idxmax()が返すのは最大値ではなくインデックスであることです。
max()との違い
s.max()
は最大値を返します。
一方、
s.idxmax()
は最大値のインデックスを返します。
例えば、
import pandas as pd
s = pd.Series([10, 30, 20, 50, 40])
print(s.max())
print(s.idxmax())
実行結果:
50
3
| メソッド | 戻り値 |
|---|---|
max() |
最大値 |
idxmax() |
最大値のインデックス |
「最大値はいくつ?」ならmax()、
「最大値はどの位置?」ならidxmax()と覚えると分かりやすいでしょう。
Seriesでidxmax()を使う
まずはPandasのSeriesで使ってみましょう。
import pandas as pd
scores = pd.Series(
[65, 82, 91, 74, 88],
index=["田中", "佐藤", "鈴木", "高橋", "伊藤"]
)
print(scores.idxmax())
実行結果:
鈴木
最大値は91で、対応するインデックスが鈴木だからです。
最大値そのものを取得する場合は、
print(scores.max())
とします。
実行結果:
91
idxmax()で最大値を持つ行を取得する
idxmax()を使うと、最大値を持つデータを特定できます。
例えば、商品の売上データを考えてみましょう。
import pandas as pd
sales = pd.Series(
[120000, 250000, 180000, 320000, 210000],
index=["商品A", "商品B", "商品C", "商品D", "商品E"]
)
product = sales.idxmax()
print(product)
実行結果:
商品D
最大売上の商品を取得できました。
最大売上金額も取得するなら、
print(sales.max())
とします。
320000
DataFrameでidxmax()を使う
idxmax()はDataFrameでも利用できます。
例えば、次のようなDataFrameを作ります。
import pandas as pd
df = pd.DataFrame({
"Python": [80, 90, 75],
"Ruby": [70, 85, 95],
"Java": [88, 78, 92]
}, index=["田中", "佐藤", "鈴木"])
print(df)
実行結果:
Python Ruby Java
田中 80 70 88
佐藤 90 85 78
鈴木 75 95 92
ここで、
print(df.idxmax())
を実行します。
結果:
Python 佐藤
Ruby 鈴木
Java 鈴木
dtype: object
これは各列について最大値を持つ行のインデックスを返しています。
axisを指定する
DataFrameのidxmax()では、axisを指定できます。
axis=0
デフォルトではaxis=0です。
df.idxmax(axis=0)
各列について最大値を持つ行のインデックスを返します。
Python 佐藤
Ruby 鈴木
Java 鈴木
axis=1
axis=1を指定すると、各行について最大値を持つ列名を取得できます。
print(df.idxmax(axis=1))
結果:
田中 Java
佐藤 Python
鈴木 Ruby
dtype: object
例えば「それぞれの生徒が最も得意な科目」を調べる場合に便利です。
idxmax()で最大値そのものを取得する
idxmax()はインデックスを返すため、最大値そのものが欲しい場合はmax()を使います。
ただし、idxmax()で取得したインデックスを利用して、最大値を取り出すこともできます。
index = scores.idxmax()
print(scores[index])
実行結果:
91
または、
print(scores.loc[scores.idxmax()])
としても取得できます。
DataFrameから最大値を持つ行を取得する
DataFrameで最大値を持つ行全体を取得したい場合にもidxmax()が使えます。
import pandas as pd
df = pd.DataFrame({
"name": ["田中", "佐藤", "鈴木"],
"sales": [100, 250, 180]
})
index = df["sales"].idxmax()
print(df.loc[index])
実行結果:
name 佐藤
sales 250
Name: 1, dtype: object
この方法を使えば、「売上が最大の社員の情報を取得する」といった処理ができます。
最大値の行を丸ごと取得する
先ほどの方法を少し応用すると、最大値を持つ行をDataFrame形式で取得できます。
index = df["sales"].idxmax()
print(df.loc[[index]])
結果:
name sales
1 佐藤 250
loc[[index]]のように二重の[]を使うことで、SeriesではなくDataFrameとして取得できます。
最大値が複数ある場合
idxmax()を使うときに注意したいのが、最大値が複数存在する場合です。
例えば、
import pandas as pd
s = pd.Series([100, 200, 300, 300, 150])
print(s.idxmax())
結果:
2
最大値300はインデックス2と3に存在しています。
しかし、idxmax()は最初に出現する最大値のインデックスを返します。
つまり、
index 0 1 2 3 4
value 100 200 300 300 150
↑
ここ
となります。
最大値を持つすべての行を取得する
最大値が複数ある場合、それらをすべて取得したいことがあります。
その場合はmax()と条件式を組み合わせます。
max_value = s.max()
print(s[s == max_value])
結果:
2 300
3 300
dtype: int64
DataFrameの場合も同様です。
max_value = df["sales"].max()
print(df[df["sales"] == max_value])
これで最大値を持つすべての行を取得できます。
NaNが含まれる場合のidxmax()
Pandasでは、データにNaNが含まれることがあります。
import pandas as pd
import numpy as np
s = pd.Series([10, np.nan, 30, 20])
print(s.idxmax())
通常、NaNを除外して最大値を持つインデックスを取得します。
2
30が最大値なので、インデックス2が返されます。
ただし、データがすべてNaNの場合などは、期待する結果にならない可能性があります。
実際のデータ分析では、欠損値の状態も確認しておくことが重要です。
idxmax()とnumpy.argmax()の違い
Pythonで最大値の位置を調べる方法として、NumPyのargmax()もあります。
例えば、
import numpy as np
data = np.array([10, 30, 20, 50, 40])
print(np.argmax(data))
結果:
3
idxmax()と似ていますが、両者には違いがあります。
| 方法 | 主な対象 | 返すもの |
|---|---|---|
idxmax() |
Pandas Series / DataFrame | インデックス |
np.argmax() |
NumPy配列 | 最大値の位置 |
特にPandasでは、文字列などのラベルをインデックスとして設定できます。
s = pd.Series(
[10, 30, 20],
index=["A", "B", "C"]
)
print(s.idxmax())
結果:
B
このように、Pandasのidxmax()はインデックスラベルをそのまま返せる点が便利です。
idxmax()の実践例
ここでは、実際のデータ分析でよくある使い方を紹介します。
売上が最大の日を調べる
import pandas as pd
sales = pd.Series(
[120000, 180000, 250000, 210000, 300000],
index=[
"2026-09-01",
"2026-09-02",
"2026-09-03",
"2026-09-04",
"2026-09-05"
]
)
print(sales.idxmax())
結果:
2026-09-05
最大売上の日付を簡単に取得できます。
最大売上と商品名を取得する
import pandas as pd
df = pd.DataFrame({
"product": ["A", "B", "C", "D"],
"sales": [100000, 250000, 180000, 320000]
})
index = df["sales"].idxmax()
print("商品:", df.loc[index, "product"])
print("売上:", df.loc[index, "sales"])
結果:
商品: D
売上: 320000
idxmax()でよくある間違い
最大値が返ってくると思ってしまう
次のコードでは、
print(s.idxmax())
最大値ではなく、最大値のインデックスが返ります。
最大値が欲しいなら、
print(s.max())
を使います。
DataFrame全体に対して使う場合
df.idxmax()
では、基本的に列ごとの最大値のインデックスが返ります。
「DataFrame全体の最大値がどこにあるのか」を調べたい場合には、idxmax()だけでは目的を達成できません。
まず、対象となる列を指定するなど、データの構造に応じた処理が必要です。
idxmax()とidxmin()の違い
最大値ではなく、最小値を持つインデックスを取得したい場合はidxmin()を使います。
import pandas as pd
s = pd.Series([50, 20, 80, 10, 40])
print(s.idxmin())
結果:
3
最小値が10で、そのインデックスが3だからです。
| メソッド | 用途 |
|---|---|
idxmax() |
最大値のインデックス |
idxmin() |
最小値のインデックス |
max() |
最大値 |
min() |
最小値 |
Pythonのidxmaxまとめ
PythonのPandasで利用できるidxmax()は、最大値を持つ要素のインデックスを取得するための便利なメソッドです。
基本的な使い方は次のとおりです。
s.idxmax()
DataFrameでは、
df.idxmax()
とすることで、列ごとに最大値を持つ行のインデックスを取得できます。
また、
df.idxmax(axis=1)
とすれば、行ごとに最大値を持つ列を調べられます。
特に重要なのは、max()との違いです。
s.max() # 最大値
s.idxmax() # 最大値のインデックス
Pandasを使ったデータ分析では、「最大値そのもの」だけでなく「最大値を持つデータがどこにあるか」を調べるケースが多くあります。そのようなときにidxmax()を覚えておくと、コードをシンプルに書けます。
「最大値を取得するならmax()、最大値の場所を取得するならidxmax()」と覚えておくとよいでしょう。
pandas|集計・グループ化の関連記事
groupbyや各種集計関数で、データを要約する操作の記事です。
- median()でデータの中央値を瞬時に把握!歪んだ分布の傾向を掴む
- nlargest()とnsmallest()でトップN個のデータを見つける
- Pandas pivot_table 徹底解説: 複雑なデータ集計をマスターしよう
- Pandas pivot 徹底解説: データをワイド形式に再構築
- pivot_table()で複雑なクロス集計も自由自在!カテゴリごとの統計量を算出
- quantileとは?分位点・四分位数の求め方をpandas・NumPyで解説
pandas全体の使い方は「pandasの使い方を初心者向けに解説」でまとめています。





