スポンサーリンク

【Python】Pandas データフレームを使ったランク計算

記事内に広告が含まれています。

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() メソッドは、数値データに順位を割り当てる際に便利です。多様なモードやオプションを組み合わせることで、多くののランキング要件に対応できます。

スポンサーリンク
Python
著者SNS
タイトルとURLをコピーしました