Pandasには、データをランク付けするための便利なメソッド rank()
が用意されています。
これを使用することで、数値データに基づく順位を簡単に計算できます。
ランク計算の方法をまとめます。
基本的なランク計算
Pandasの rank()
メソッドは、各値の順位を計算して、新しい列として追加できます。
import pandas as pd
# サンプルデータ
data = {'名前': ['田中', '佐藤', '鈴木', '高橋'],
'スコア': [90, 85, 85, 95]}
df = pd.DataFrame(data)
# ランクを計算
df['ランク'] = df['スコア'].rank()
print(df)
出力
名前 スコア ランク
0 田中 90 3.0
1 佐藤 85 1.5
2 鈴木 85 1.5
3 高橋 95 4.0
デフォルトでは、値が同じ場合、順位の平均値が割り当てられます(これを “average” モードと呼びます)。
ランキングモードの指定
rank()
には、同順位の扱いを指定するための method
引数があります。
method | 説明 |
---|---|
'average' | デフォルト。平均順位を割り当てる |
'min' | 同順位の最小値を割り当てる |
'max' | 同順位の最大値を割り当てる |
'first' | データの順番に従って順位を割り当てる |
'dense' | 同順位の次に連続した順位を割り当てる |
以下に、それぞれの例を示します。
# 各モードのランクを計算
df['ランク_average'] = df['スコア'].rank(method='average')
df['ランク_min'] = df['スコア'].rank(method='min')
df['ランク_max'] = df['スコア'].rank(method='max')
df['ランク_dense'] = df['スコア'].rank(method='dense')
print(df)
出力
名前 スコア ランク ランク_average ランク_min ランク_max ランク_dense
0 田中 90 3.0 3.0 3.0 3.0 2.0
1 佐藤 85 1.5 1.5 1.0 2.0 1.0
2 鈴木 85 1.5 1.5 1.0 2.0 1.0
3 高橋 95 4.0 4.0 4.0 4.0 3.0
昇順と降順の指定
rank()
の引数 ascending
を使って、昇順か降順かを指定できます。
# 降順でランク付け
df['ランク_降順'] = df['スコア'].rank(ascending=False)
print(df)
出力
名前 スコア ランク ランク_降順
0 田中 90 3.0 2.0
1 佐藤 85 1.5 3.5
2 鈴木 85 1.5 3.5
3 高橋 95 4.0 1.0
グループごとのランク計算
データが複数のカテゴリに分かれている場合、 groupby()
を使ってカテゴリごとにランクを計算できます。
# サンプルデータ
data = {'名前': ['田中', '佐藤', '鈴木', '高橋', '山本'],
'スコア': [90, 85, 85, 95, 80],
'グループ': ['A', 'A', 'B', 'B', 'A']}
df = pd.DataFrame(data)
# グループごとにランクを計算
df['グループ内ランク'] = df.groupby('グループ')['スコア'].rank(ascending=False)
print(df)
出力
名前 スコア グループ グループ内ランク
0 田中 90 A 1.0
1 佐藤 85 A 2.0
2 鈴木 85 B 2.0
3 高橋 95 B 1.0
4 山本 80 A 3.0
NaNを含むデータのランク計算
欠損値 (NaN) を含むデータでは、 na_option
引数を使ってランクの扱いを指定できます。
na_option | 説明 |
---|---|
'keep' | デフォルト。NaNにランクを割り当てない |
'top' | NaNを最上位に割り当てる |
'bottom' | NaNを最下位に割り当てる |
# NaNを含むデータ
data = {'名前': ['田中', '佐藤', '鈴木', '高橋', '山本'],
'スコア': [90, 85, None, 95, 80]}
df = pd.DataFrame(data)
# NaNの扱いを指定
df['ランク'] = df['スコア'].rank(na_option='bottom')
print(df)
出力
名前 スコア ランク
0 田中 90.0 3.0
1 佐藤 85.0 2.0
2 鈴木 NaN 5.0
3 高橋 95.0 4.0
4 山本 80.0 1.0
応用例 ランキング表の作成
ランクを利用して、上位n件を抽出することも簡単です。
# 上位3名を抽出
top_3 = df.nsmallest(3, 'ランク')
print(top_3)
名前 スコア ランク
4 山本 80.0 1.0
1 佐藤 85.0 2.0
0 田中 90.0 3.0
まとめ
Pandasの rank()
メソッドは、数値データに順位を割り当てる際に便利です。多様なモードやオプションを組み合わせることで、多くののランキング要件に対応できます。