この膨大なデータ、値が大きい順にランク付けしたいなぁ
この商品データを単価が大きい順にランク付けしたいなぁ
こんな時、データ加工の時によくあることだと思います。
そんなときは、値順にランク付けが出来るrank()
関数というものがあります。
最初にデータを用意していきます。
import pandas as pd
import numpy as np
df01 = pd.DataFrame( {'name':['A', 'B', 'C', 'D' ,'E',"F"],
'math':[60, 70, 80 ,90,100,60]})
df01
name math
0 A 60
1 B 70
2 C 80
3 D 90
4 E 100
5 F 60
今回については、6行しかありませんので、分かりやすいかと思いますが、実際の実務では100万行などなる場合も全く珍しくありません。
そんな膨大なデータを一気にランク付け出来たら便利ですよね。
それでは、実際にコードを書いていきます。
rank = df01["math"].rank(method="min" , ascending=False)
rank
0 5.0
1 4.0
2 3.0
3 2.0
4 1.0
5 5.0
method="min"
にすることによって、重複している値が同じ値になります。
別でmethod="first"
にすることによって、上の行にあるものから順番に番号がつきます。
ascending=False
にすることによって、大きい値順から順位がつきます。
df01["math"].rank(method="first" , ascending=False)
0 5.0
1 4.0
2 3.0
3 2.0
4 1.0
5 6.0
先ほど作成したrankともともとのデータフレームを結合していきます。
df01_rank = pd.concat([df01 , rank] , axis=1)
df01_rank
name math math
0 A 60 5.0
1 B 70 4.0
2 C 80 3.0
3 D 90 2.0
4 E 100 1.0
5 F 60 5.0
このままだと、カラム名が重複しているので、カラム名の変更と、ランク順にsort_values()
を用いて見やすくしていきます。
df01_rank.columns=["name" , "math" , "rank"]
df01_rank.sort_values("rank" ,ascending=True)
name math rank
4 E 100 1.0
3 D 90 2.0
2 C 80 3.0
1 B 70 4.0
0 A 60 5.0
5 F 60 5.0
このように上手くランク付けと並びかえをすることができました。
是非お持ちのデータで活用してみてください。