【Pandasデータ分析】DataFrame・Seriesを「順位付け」するrank()メソッドでランキングを生成 🏆
データ分析において、「特定の基準に基づいてデータを順位付けしたい」というニーズは非常に一般的です。例えば、売上高の高い順に商品を並べ替えたり、試験の点数で生徒に順位をつけたり、ウェブサイトのアクセス数でページをランキングしたりする際に、順位付けは欠かせない処理です。
Pandasの**rank()メソッド**は、DataFrameやSeriesの数値データに対して、この順位付けを効率的に行うための強力なツールです。重複する値の扱い方や、昇順・降順の指定など、柔軟なオプションを提供します。この記事では、rank()メソッドの基本的な使い方から、知っておくと便利な応用例まで、短いサンプルコードと丁寧な解説を交えてご紹介します。
rank()メソッドとは?なぜ順位付けが必要なのか?
rank()メソッドは、SeriesまたはDataFrame内の各要素に対して、その値の相対的な順位を返します。
なぜデータ分析で順位付けが必要なのでしょうか?
-
相対的な位置の把握: 個々の値がデータセット全体の中でどの程度の位置にあるのかを視覚的に、または数値的に把握できます。
-
パフォーマンス評価: 売上、スコア、パフォーマンス指標などに基づいて、最も成績の良い(悪い)項目を特定できます。
-
データの比較: 異なるデータセットやグループ間で、相対的な順位を比較することで、より深い洞察を得られます。
-
機械学習の前処理: 特徴量エンジニアリングにおいて、数値データを順位に変換することで、線形モデルなどにおける外れ値の影響を軽減したり、非線形な関係を捉えやすくしたりできる場合があります。
1. Seriesの順位付けの基本
Seriesにrank()を適用すると、そのSeries内の値に基づいて順位が計算されます。
基本的な使い方と重複値のデフォルト処理
デフォルトでは、rank()は値を昇順に並べ(小さい値が低い順位)、重複する値には平均順位(method='average')を与えます。
import pandas as pd
import numpy as np
# サンプルSeriesの作成 (試験の点数)
s_scores = pd.Series([85, 92, 78, 92, 65, 95], index=['A', 'B', 'C', 'D', 'E', 'F'])
print("元のSeries (スコア):\n", s_scores)
# Seriesの順位を取得 (デフォルト設定)
# 小さい値が低い順位、重複値は平均順位
s_ranked = s_scores.rank()
print("\nSeriesの順位 (デフォルト、昇順、平均順位):\n", s_ranked)
解説:
-
s_scores.rank(): Seriess_scoresの各要素に順位を割り当てます。 -
65が最小なので順位1.0。 -
78が次に小さいので順位2.0。 -
85が順位3.0。 -
92が2つありますが、もし重複がなければそれぞれ4位と5位になるはずでした。その平均である(4+5)/2 = 4.5が両方に割り当てられます。 -
95が最大なので順位6.0。
2. DataFrameの順位付け
DataFrameにrank()を適用すると、デフォルトで列ごとに順位が計算されます。
列ごとの順位付け (axis=0 またはデフォルト)
各列(例: 各教科の点数)において、各行(例: 各生徒)が何位かを知りたい場合に利用します。
# サンプルDataFrameの作成 (生徒の科目別点数)
df_grades = pd.DataFrame({
'数学': [85, 92, 78, 92, 65],
'理科': [70, 85, 90, 85, 75],
'英語': [90, 80, 70, 90, 60]
}, index=['生徒A', '生徒B', '生徒C', '生徒D', '生徒E'])
print("\n元のDataFrame (科目別点数):\n", df_grades)
# 各科目(列)で生徒の順位を取得
df_ranked_cols = df_grades.rank()
print("\nDataFrameの列ごとの順位 (デフォルト):\n", df_ranked_cols)
解説:
df_grades.rank()は、各列(’数学’, ‘理科’, ‘英語’)ごとに独立して順位を計算します。例えば’数学’列では、92が2つあるため、その平均順位4.5が割り当てられています。
行ごとの順位付け (axis=1)
各行(例: 各生徒)において、科目間(列)でどの科目が何位かを知りたい場合に利用します。
# 各生徒(行)で科目の順位を取得
df_ranked_rows = df_grades.rank(axis=1)
print("\nDataFrameの行ごとの順位:\n", df_ranked_rows)
解説:
df_grades.rank(axis=1)は、各行ごとに独立して(例: 生徒Aの数学、理科、英語の点数の中で)順位を計算します。
3. 順位付けのオプション:methodとascending
rank()メソッドは、重複する値の扱い方や順位の方向を柔軟に制御できます。
重複値の処理方法 (method引数)
-
'average'(デフォルト): 重複する値に平均順位を割り当てる。 -
'min': 重複する値に最も低い(小さい)順位を割り当てる。 -
'max': 重複する値に最も高い(大きい)順位を割り当てる。 -
'first': 重複する値が出現する順序に基づいて順位を割り当てる。 -
'dense': 重複する値に同じ順位を割り当て、次の異なる値には連続した順位を割り当てる(ギャップなし)。
# 重複値のあるSeries
s_dup = pd.Series([10, 20, 15, 20, 5])
print("\n元のSeries (重複あり):\n", s_dup)
print("\nMethod: 'average' (デフォルト):\n", s_dup.rank(method='average'))
print("Method: 'min':\n", s_dup.rank(method='min'))
print("Method: 'max':\n", s_dup.rank(method='max'))
print("Method: 'first':\n", s_dup.rank(method='first'))
print("Method: 'dense':\n", s_dup.rank(method='dense'))
解説:
20という値が2つあります。
-
'average'は20に3.5(3と4の平均)を割り当てます。 -
'min'は20に3.0(重複する値の中での最低順位)を割り当てます。 -
'max'は20に4.0(重複する値の中での最高順位)を割り当てます。 -
'first'は最初の20に3.0、次の20に4.0を割り当てます。 -
'dense'は20に3.0を割り当て、次の値(10, 15の次)20に3を与え、それ以降にギャップを作りません。
順位の方向 (ascending引数)
-
True(デフォルト): 小さい値が低い順位(昇順)。 -
False: 小さい値が高い順位(降順)。(例: 売上高の高い方が1位)
# スコアを降順で順位付け (高いスコアほど順位が低い = 良い順位)
s_ranked_desc = s_scores.rank(ascending=False)
print("\nスコアの降順順位付け (高いスコアが低い順位):\n", s_ranked_desc)
解説:
ascending=Falseとすることで、値が大きいほど低い順位(例: 1位)が割り当てられます。
4. 欠損値(NaN)の扱い
デフォルトでは、NaNは順位計算から除外され、NaNの位置にはNaNが割り当てられます。na_option引数で制御できます。
-
'keep'(デフォルト): NaNはNaNのまま。 -
'top': NaNを最も低い順位(ascending=Trueなら1位、ascending=Falseなら最下位)として扱う。 -
'bottom': NaNを最も高い順位(ascending=Trueなら最下位、ascending=Falseなら1位)として扱う。
s_nan_scores = pd.Series([85, np.nan, 78, 92, 65, 95])
print("\nNaNを含むSeries:\n", s_nan_scores)
print("\nNaNを'keep' (デフォルト):\n", s_nan_scores.rank(na_option='keep'))
print("NaNを'top' (昇順でNaNが1位):\n", s_nan_scores.rank(na_option='top'))
print("NaNを'bottom' (昇順でNaNが最下位):\n", s_nan_scores.rank(na_option='bottom'))
まとめ
Pandasのrank()メソッドは、DataFrameやSeriesの数値データを基準に、柔軟な順位付けを行うための非常に強力なツールです。重複値の処理方法(method)や順位の方向(ascending)、そして欠損値の扱い方(na_option)を細かく制御できるため、様々な分析ニーズに対応できます。
データセット内で特定の要素の相対的な位置を特定したり、パフォーマンスを評価したり、ランキングを作成したりする際に、rank()メソッドは不可欠な存在となるでしょう。このメソッドをマスターし、あなたのデータ分析の精度と洞察力をさらに高めましょう!

