PandasのDataFrameとSeriesを順位付けするrankメソッドの使い方

今回はPandasのDataFrameとSeriesを順位付けする方法をマスターしましょう。順位付けというのは、ある指定した条件にしたがってランクを決めることです。今回はrank()メソッドを用います。

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

Pandasのデータフレームをソートする方法まとめ

rank()メソッドをマスターする

Seriesへのrank()メソッドの基本的な使い方

使い方は非常に簡単です。作成したSeriesに.rank()を付与すれば終わりです。出力結果をみると、新たな数値が生成されていますね。今回は引数に何も指定しなかったので、mathematicsの45点が一番低く、1.0ポイントと出力されています。一方、Englishの90点は一番大きいので、5.0ポイントが与えられていますね。

Python
>>> # 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
MEMO
値が同じ場合には、平均値が与えられます。以下で詳しく説明しますが、例えば、Japaneseの70点が60点でsocietyと同率タイとします。その場合、Japaneseとsocietyは両方2.5ポイントと表記されます。

イメージはかなり掴めたのではないでしょうか!それでは早速引数の使い方など、細かい部分を解説していきます。


ascendingで昇順・降順を指定する

前項では基本的な使い方を見てきましたが、点数の高い教科のランク値が小さい数値というのは少し違和感があります。昇順・降順を引数で指定して修正してみましょう。

引数にascendingFalse/Trueを指定します。今回はFalseにすることで教科の点数とランク値が比例して表示されました。とても見やすいですね!

Python
>>> # 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になります。

最大値で取る

最大値はmethodmaxを指定します。

Python
>>> # 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を指定します。

Python
>>> # 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ポイントになっていますね。

Python
>>> # rank()メソッドの引数にminを指定
>>> s2.rank(method="min")
Japanese       2.0
mathematics    1.0
science        4.0
society        3.0
English        5.0
dtype: float64
注意
firstは数値のみを対象にするので、要注意です!

DataFrameでのランク付け

DataFrameへのrank()メソッドの基本的な使い方

DataFrameでも基本的には同様です。デフォルトでは縦方向に各カラム内でランク付けがなされます。これは元々DataFrameはSeriesが複数重なっているイメージですので、カラム単位での処理が基本になります。

Python
>>> # 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で指定する。

Python
>>> # 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に対しても処理可能
  • パーセンテージで返すこともできる