Pandasのrank関数は、データの順位を簡単に計算できる便利なツールです。この記事では基本的なランクの計算方法から、整数での表示、特定の列を指定したランクの計算方法まで、rank関数の使い方を解説します。
rank関数の構文とパラメータ一覧
Pandasのrank()関数の基本構文は以下のとおりです。
DataFrame.rank(
axis=0,
method='average',
numeric_only=False,
na_option='keep',
ascending=True,
pct=False
)
| パラメータ | デフォルト値 | 説明 |
|---|---|---|
axis | 0 | 0で列方向(行ごとにランク付け)、1で行方向(列ごとにランク付け) |
method | 'average' | 同順位の処理方法。'average' / 'min' / 'max' / 'first' / 'dense' から選択 |
numeric_only | False | Trueにすると数値列のみ対象にする |
na_option | 'keep' | NaN値の扱い。'keep'(NaNのまま)/ 'top'(最上位)/ 'bottom'(最下位) |
ascending | True | Falseにすると降順でランク付け |
pct | False | Trueにするとランクをパーセンタイル(0〜1)で返す |
それぞれのパラメータについて、以下のセクションで具体的なコード例とともに解説します。
Pandasのrank関数の基本的な使い方
rank関数は、PandasのDataFrameやSeriesオブジェクトに対して、データの順位を計算するための関数で、以下のような用法となります。
DataFrame.rank(axis=0, method='average', numeric_only=None, na_option='keep', ascending=True, pct=False)
各パラメータの説明とデフォルト値を具体例を交えて解説します。
Pandasで特定の列を指定してランクを計算する基本的な方法
シンプルなデータセットを用いて、rank関数の基本的な使用方法を示します。以下のコードは、学生のスコアに基づいてランクを計算し、新しい列としてDataFrameに追加します。
import pandas as pd
data = {'Score': [90, 85, 77, 95, 88]}
df = pd.DataFrame(data)
df['Rank'] = df['Score'].rank(ascending=False)
print(df)
このコードを実行すると、スコアに基づいたランクが計算され、新しい列として追加されます。
Pandasのrank関数で降順ランクを付ける方法
デフォルトでは昇順(値が小さいほど順位が高い)でランクが付きます。スコアが高いほど1位にしたい場合はascending=Falseを指定します。
import pandas as pd
data = {'Name': ['Alice', 'Bob', 'Charlie', 'Dave'],
'Score': [85, 92, 78, 92]}
df = pd.DataFrame(data)
# 降順ランク(スコアが高いほど1位)
df['Rank'] = df['Score'].rank(ascending=False, method='min')
print(df)
実行結果:
Name Score Rank
0 Alice 85 3.0
1 Bob 92 1.0
2 Charlie 78 4.0
3 Dave 92 1.0
同スコアのBobとDaveには最小値である1位が割り当てられます。methodパラメータについては次のセクションで詳しく解説します。
Pandasのrank関数で整数のランクを表示する方法
methodパラメータを'min'や'max'に設定すると、ランクが整数で表示されます。以下のコードは、同じスコアを持つ学生に最小の整数ランクを割り当てます。
df['Integer Rank'] = df['Score'].rank(method='min', ascending=False).astype(int)
methodパラメータの5種類を比較する
同じ値が複数存在するとき(同順位)、ランクをどう割り当てるかをmethodで指定します。
以下の例でスコア[85, 92, 78, 92](降順)に対する各methodの結果を比較します。
| method | 説明 | 92(1件目) | 92(2件目) | 次の順位 |
|---|---|---|---|---|
'average' | 同順位の平均値を割り当て(デフォルト) | 1.5 | 1.5 | 3 |
'min' | 同順位の最小値を割り当て | 1 | 1 | 3(2はスキップ) |
'max' | 同順位の最大値を割り当て | 2 | 2 | 3 |
'first' | 出現順に一意のランクを割り当て | 1 | 2 | 3 |
'dense' | 最小値を割り当て・次のランクは連続 | 1 | 1 | 2(スキップなし) |
import pandas as pd
df = pd.DataFrame({'Score': [85, 92, 78, 92]})
for method in ['average', 'min', 'max', 'first', 'dense']:
df[f'rank_{method}'] = df['Score'].rank(method=method, ascending=False)
print(df)
'dense'と'min'の違い:どちらも同順位に最小値を割り当てますが、'dense'は次の順位が連続します(1→2→3)。'min'はスキップします(1→1→3)。順位の抜けを出したくない場合は'dense'を使いましょう。
よくあるエラーやトラブルシューティング
rank関数使用時によく遭遇するエラーや問題点とその解決策を紹介します。
NaN値の取り扱い
- 問題: データセットにNaN値が含まれている場合、
rank関数のデフォルトの挙動はNaN値にランクを割り当てません。 - 解決策:
na_optionパラメータを使用して、NaN値のランクの扱いを制御します。 - コメント: NaN値をデータセットの最下位として扱いたい場合は、
na_option='bottom'を設定します。
df['Rank with NA'] = df['Score'].rank(na_option='bottom')
データ型の不整合
- 問題: データセットの中に文字列や日付など、数値でないデータが含まれている場合、
rank関数はエラーを返すことがあります。 - 解決策: データセットの対象列を数値型に変換します。
- コメント:
df['Score'] = pd.to_numeric(df['Score'], errors='coerce') # <strong><code>errors='coerce': 数値に変換できない値がある場合、それらの値をNaN(Not a Number)に置き換えます。
methodパラメータの誤用
- 問題:
methodパラメータの設定が不適切であると、同じスコアのデータに対するランクの振り方が期待と異なる場合があります。 - 解決策:
methodパラメータを適切な値(’average’, ‘min’, ‘max’, ‘first’, ‘dense’)に設定します。 - コメント:以下のコードは、同じスコアのデータに対して、データが現れた順に異なるランクを割り当てます。
df['Score'].rank(method='first')
-
‘average’
- 同じスコアを持つデータに対して、そのランクの平均値を割り当てます。
- 例:スコアが [10, 20, 20, 30] の場合、ランクは [1, 2.5, 2.5, 4] になります。
-
‘min’
- 同じスコアを持つデータに対して、そのグループの最小のランクを割り当てます。
- 例:スコアが [10, 20, 20, 30] の場合、ランクは [1, 2, 2, 4] になります。
-
‘max’
- 同じスコアを持つデータに対して、そのグループの最大のランクを割り当てます。
- 例:スコアが [10, 20, 20, 30] の場合、ランクは [1, 3, 3, 4] になります。
-
‘first’
- 同じスコアを持つデータに対して、データが現れた順に異なるランクを割り当てます。
- 例:スコアが [10, 20, 20, 30] の場合、ランクは [1, 2, 3, 4] になります。
-
‘dense’
- 同じスコアを持つデータに対して、同じランクを割り当て、次のランクはその次の整数になります(ランクにギャップがない)。
- 例:スコアが [10, 20, 20, 30] の場合、ランクは [1, 2, 2, 3] になります。
Pandasで特定の列を指定して他の列をランク付けする方法
次に特定の列の値に基づいて、他の列のデータをランク付けする方法を紹介します。これは例えば、あるテストのスコアに基づいて、生徒の成績をランク付けしたい場合などに使用します。
以下は生徒の数学のテストスコアに基づいて、英語のテストスコアをランク付けするシンプルな例です。
import pandas as pd
# サンプルデータの作成
data = {
'Student': ['Alice', 'Bob', 'Charlie', 'David'],
'Math_Score': [90, 85, 77, 92],
'English_Score': [88, 79, 92, 85]
}
df = pd.DataFrame(data)
# Math_Scoreを基準にして、English_Scoreのランクを計算
df['English_Rank'] = df['English_Score'].rank(ascending=False)
# Math_Scoreの値に基づいて、English_Rankをソート
df = df.sort_values(by='Math_Score', ascending=False)
print(df)
このコードを実行すると、数学のスコアに基づいて、英語のスコアがランク付けされ、新しい列として追加されます。そして、数学のスコアでデータがソートされます。

この例ではMath_Score列を基準にしてEnglish_Scoreのランクを計算し、その結果を新しい列English_Rankに保存し、最後にMath_Scoreの値でソートしています。
以上、ランク関数について説明しました。
特にmethodについては理解しておかないと想定と違う順位付けを行う可能性があるので、「複数の種類がある」ということは認識しておく必要があると思います。
まとめ:Pandasのrank関数を使いこなすポイント
この記事ではrank()関数の使い方を以下の観点で解説しました。
- 基本的な使い方:SeriesおよびDataFrameへの適用方法
- 降順ランク:
ascending=Falseで高スコア=1位を実現 - methodパラメータ:同順位の扱いを
average/min/max/first/denseで切り替える - 整数ランクの取得:
method='min'または'max'を使う - 複数列への応用:特定の列を基準に他の列をランク付けする
- NaNやデータ型:
na_optionの設定とデータ型の統一に注意する
特にmethodパラメータは想定外のランクを生む原因になりやすいため、用途に合わせて意識的に選択することが重要です。
Pandasのその他の集計・変換機能についても合わせて確認しておくと、データ分析の幅が広がります。
→ PandasのDataFrameやSeriesの基本操作はこちら
Pandasやデータ分析をより体系的に学びたい場合、独学とスクールのどちらが自分に合っているかを判断する材料として、以下の記事が参考になります。AI時代の学習選択肢を診断付きで整理しています。