今回はPandasのDataFrameとSeriesを順位付けする方法をマスターしましょう。順位付けというのは、ある指定した条件にしたがってランクを決めることです。今回はrank()メソッドを用います。
似ている処理として、sortがあります。sortは単純な数値の昇順・降順といった並び替えです。rank()メソッドは、与えられた値に対してランク値を新たに生成します。同じ数値の場合でも、指定した条件にしたがって、ランクを決め切ることができます。sortについて知りたい方は以下の記事を見てみてください!

もくじ
rank()メソッドをマスターする
Seriesへのrank()メソッドの基本的な使い方
使い方は非常に簡単です。作成したSeriesに.rank()を付与すれば終わりです。出力結果をみると、新たな数値が生成されていますね。今回は引数に何も指定しなかったので、mathematicsの45点が一番低く、1.0ポイントと出力されています。一方、Englishの90点は一番大きいので、5.0ポイントが与えられていますね。
>>> # Seriesを作成する
>>> s = pd.Series([70, 45, 80, 60, 90], index=['Japanese', 'mathematics', 'science', 'society', 'English'])
>>> s
Japanese 70
mathematics 45
science 80
society 60
English 90
dtype: int64
>>> # rank()メソッドを使う
>>> s.rank()
Japanese 3.0
mathematics 1.0
science 4.0
society 2.0
English 5.0
dtype: float64
イメージはかなり掴めたのではないでしょうか!それでは早速引数の使い方など、細かい部分を解説していきます。
ascendingで昇順・降順を指定する
前項では基本的な使い方を見てきましたが、点数の高い教科のランク値が小さい数値というのは少し違和感があります。昇順・降順を引数で指定して修正してみましょう。
引数にascendingでFalse/Trueを指定します。今回はFalseにすることで教科の点数とランク値が比例して表示されました。とても見やすいですね!
>>> # Seriesを作成する
>>> s = pd.Series([70, 45, 80, 60, 90], index=['Japanese', 'mathematics', 'science', 'society', 'English'])
>>> s
Japanese 70
mathematics 45
science 80
society 60
English 90
dtype: int64
>>> # rank()メソッドの引数に指定
>>> s.rank(ascending=False)
Japanese 3.0
mathematics 5.0
science 2.0
society 4.0
English 1.0
dtype: float64
同率タイ時のルールを変更する
値が同率の場合、デフォルトでは平均値をとります。ここでは平均値ではなく、最大値や最小値、出現順に取る方法を解説していきます。ルールの変更は、引数にmethodを指定します。最大値はmax、最小値はmin、出現順はfirstです。デフォルトの平均値はaverageになります。
最大値で取る
最大値はmethodにmaxを指定します。
>>> # Seriesを作成する(Japaneseを60点に変更)
>>> s2 = pd.Series([60, 45, 80, 60, 90], index=['Japanese', 'mathematics', 'science', 'society', 'English'])
>>> s2
Japanese 60
mathematics 45
science 80
society 60
English 90
dtype: int64
>>> # rank()メソッドの引数にmaxを指定
>>> s2.rank(method="max")
Japanese 3.0
mathematics 1.0
science 4.0
society 3.0
English 5.0
dtype: float64
最小値で取る
続いて、最小値はminを指定します。
>>> # rank()メソッドの引数にminを指定
>>> s2.rank(method="min")
Japanese 2.0
mathematics 1.0
science 4.0
society 2.0
English 5.0
dtype: float64
dtype: float64
出現順に取る
出現順はfirstを指定します。今回はJapaneseの方が先に出ているので、2.0ポイントになっていますね。
>>> # rank()メソッドの引数にminを指定
>>> s2.rank(method="min")
Japanese 2.0
mathematics 1.0
science 4.0
society 3.0
English 5.0
dtype: float64
DataFrameでのランク付け
DataFrameへのrank()メソッドの基本的な使い方
DataFrameでも基本的には同様です。デフォルトでは縦方向に各カラム内でランク付けがなされます。これは元々DataFrameはSeriesが複数重なっているイメージですので、カラム単位での処理が基本になります。
>>> # DataFrameを作成する
>>> df=pd.DataFrame([[1,5,3],[60,50,300],[100,50,40],[3000,1000,2000]],
index=['Alpha', 'Beta','Gamma','Delta'],
columns=['A','B','C'])
>>> df
A B C
Alpha 1 5 3
Beta 60 50 300
Gamma 100 50 40
Delta 3000 1000 2000
>>> # rank()メソッド
>>> df.rank()
A B C
Alpha 1.0 1.0 1.0
Beta 2.0 2.5 3.0
Gamma 3.0 2.5 2.0
Delta 4.0 4.0 4.0
行に対してランク付けする
行に対してのランク付けは、引数にaxis=1で指定する。
>>> # DataFrameを作成する
>>> df=pd.DataFrame([[1,5,3],[60,50,300],[100,50,40],[3000,1000,2000]],
index=['Alpha', 'Beta','Gamma','Delta'],
columns=['A','B','C'])
>>> df
A B C
Alpha 1 5 3
Beta 60 50 300
Gamma 100 50 40
Delta 3000 1000 2000
>>> # 行方向にrank()メソッドを使用
>>> df.rank(axis=1)
A B C
Alpha 1.0 3.0 2.0
Beta 2.0 1.0 3.0
Gamma 3.0 2.0 1.0
Delta 3.0 1.0 2.0
その他の主な引数
NaNがある場合の対処方法
DataFrame内にNaNがあると、ランク付けから漏れてNaNのままです。NaNに対しての処理は、引数にna_optionを指定します。デフォルトでは、na_option=’keep’となっています。
na_option=’top’を指定する
topを指定すると、NaNが最上位に来ます。
na_option=’bottom’を指定する
bottomを指定すると、NaNが最下位に来ます。
要素をパーセンテージで返す
各要素が全体の何パーセントを占めるかを返すこともできます。引数にpct=Trueを指定しましょう。
まとめ
今回はrank()メソッドの使い方を見てきました。基本的にSeriesとDataFrameでできることは同じです。使いこなして順位表作成などさまざまな場面に活かしてください!
- rank()でランク付けができる
- 引数にascendingで昇順・降順
- 同率タイ時は、平均・最大・最小、そして出現順で処理できる
- axis=1で行に対してランク付け
- NaNに対しても処理可能
- パーセンテージで返すこともできる