Pandasでアメフト選手のデータをソートや順位付けをするno.14

![見出しを追加 (37).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/eab0056c-d809-5303-84d6-9c7f79b8082a.png)
こんにちは、まゆみです。

Pandasの記事をシリーズで書いています。

今回は14回目になります。

今回の記事では、読み込んだCSVファイルのデータを

<ul>
<li>アルファベット順に並べたり</li>
<li>数の若い順に並べたり</li>
<li>順番を逆にしてみたり</li>
<li>ランク付けをしたり</li>
</ul>

してみようと思います。

CSVデータは、[第12回目の記事](https://qiita.com/Mayumi_Pythonista/items/a9f3c89a4f66d654e3ce)で使った[『National Football Leagueの選手のデータ』](https://gist.github.com/craigmbooth/5a9be04fe72d77fa3cff)を今回も使います。

実際にPandasで当データを読み込んだ結果は下のようになります

![スクリーンショット 2021-03-19 094252.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/61548d22-116e-54e6-2600-8dd5621a2b3a.jpeg)


こちらのデータを並べ替えることによって、一番背の高い選手や一番体重の重い選手、アルファベット順に並べた時の名前の順が分かります。


ではさっそく始めていきますね。

#sort_values()メソッド
値を数の若い順、もしくはアルファベット順に並び替えるにはsort_values() メソッドを使います。

![スクリーンショット 2021-03-19 093233.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/4db77ceb-d3db-7f08-7fa5-0f34d4a5adbd.jpeg)
引用元：[Pandasドキュメント](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.sort_values.html)

Pandasドキュメントを見てみると、sort_valuesに渡せるパラメーターが色々と書いています。

そのパラメーターのなかで、『by』というパラメーターは<font color="Red">必ず書かなければいけません。</font>

<font color="Red">その他のパラメーターはオプション</font>ですので、書いても書かなくても良いです。


パラメーターby を使う時は

『何によって』ソートするか

ということを引数で明示しなければいけません。

>Pandas のドキュメントに

>Parameters: by : str or list of str

と書いているのが読めると思いますが

>ある1つのコラムを使ってソートしたい時は　str(string) コラム名を文字列で書き引数とし

>2つ以上のコラム名を使ってソートしたい時は string のリストとしてコラム名を指定して引数とします


では実際に『height_in_inches』(インチ表示の体重)を並べ変えてみます

![スクリーンショット 2021-03-19 094544.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/6e63701b-2cb5-025a-995c-478406bf9c76.jpeg)

height_in_inches コラムの値が小さい物から順に並べ替えられました。


>インチ表示じゃ、分かりにくい。

>センチメートル表示にしたい

という方は、[こちら](https://qiita.com/Mayumi_Pythonista/items/a9f3c89a4f66d654e3ce#%E8%A7%A3%E6%B1%BA%E7%AD%96)を参考にしてみてください。

![スクリーンショット 2021-03-19 095147.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/4d5c78ea-5dfa-0349-0bb1-7c9e71af1884.jpeg)

新しいコラムが既存のコラムの左側につき、数の若い順に並べ変えられました。

![アメフトプロ選手の身長って.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/358ce332-897c-3f3c-8083-15d1ca58e37f.png)


同様に、体重もキログラム表示に変えた後、数の小さい順に並び変えました。


![スクリーンショット 2021-03-19 100034.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/091435d5-1a32-6caa-2b48-cd60cb9113d0.jpeg)

もし、数の大きい物から順番に並べたい時は

<font color="Red">パラメーターascending を　False に変えます。</font>

##2つ以上のコラムを一気に並べ替える

先ほど少し触れましたが、順番に並べる<font color="Red">コラムを2つ以上指定したい時は、引数をリスト型</font>にします

```
nfl.sort_values( [ "コラム名A", "コラム名B"] )
```


![スクリーンショット 2021-03-19 101409.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/9b2b7a92-840e-97bc-feba-bbfa49efd0c0.jpeg)

height が小さい物順に並べられ、height が同じ値だった場合、その同じheight のなかでweightが小さい順に並べ替えられます。

##文字列はアルファベット順がデフォルト値

文字列にsort_values()を使うと、アルファベット順に並べられます。

さらに深堀して、もし、ある文字列のコラムはアルファベット順に、もう一つの文字列のコラムはアルファベット順とは逆の順番で並べたい時は

```
DataFrame名.sort_values( by= ["A","b"], ascending = [True, False])
```
と書くと

>Aコラムが数の若い順から並べ替えられ、

>Bコラムが数が大きい物から順番に並べ替えられます。

では、その実験をするために、"team" "full_name" というコラムのみを取り出して、新しい変数、『nfl_team_name』に代入して新たなDataFrame を作りました。

![スクリーンショット 2021-03-19 104354.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/83b7c491-641c-6546-46e1-4028c31b3b7f.jpeg)

このDataFrameを

>team 名は　アルファベット順に

>full_name はアルファベットと反対の順番に

並べ替えてみたいと思います。

下記のイラストのような風に並べ替えます
![A team.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/7a2c5fc2-0396-6225-cfab-bbefe7b79d1c.png)


実行結果は下のようになりました。

![スクリーンショット 2021-03-19 110028.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/ed899039-273f-1e2b-30e6-1c57ad597ecc.jpeg)


では最後にランク付けの方法を書いて終わりにします。

#rank()メソッド

<font color="Red">誰が一番背が高いか、誰が15番目に高いかという順位</font>を返してくれます。

センチメートル表示に変えた身長のコラムを付けたしました。

![スクリーンショット 2021-03-19 111408.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/9b64c902-29c4-1846-2d5e-e9c6399a3998.jpeg)

ランク付けをする時に、<font color="Red">同じ値があるとその順位を足して2で割った値</font>が割り当てられます。
下記のような結果になります。

![スクリーンショット 2021-03-19 111608.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/ad790f40-b2bb-15e7-638e-fe0fd57bea74.jpeg)


また、rank()メソッドで返された値をよく見ると、177.80センチの人より187.96センチの人の方がランクが低く評価されているのが分かります。

<font color="Red">rank()はデフォルトでは、数の若いものほどランキングを高く評価されます</font>から、

```
ascending = False
```

にして調整してくださいね。




##小数点の値を整数値に変える

また少数点のついた順位はおかしいので、小数点(float) を　整数(integer) に変えます。

![スクリーンショット 2021-03-19 112505.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/6be3ff0b-a36c-8e7b-4177-0a3556611614.jpeg)


背の高い順に調整して、順位を整数にしたランキングで新しいコラムを作りたいので、rank()メソッドで出した結果を

```
DataFrame["新しいコラム名"]
```

に代入しました。

![スクリーンショット 2021-03-19 114128.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/bd6e5764-a949-a54e-5c9f-6aedac6f183c.jpeg)

センチメートルの身長を大きい物順に並べて確かめてみました。


![スクリーンショット 2021-03-19 114630.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/8808cb74-e2a9-e16e-0b1d-794b189dd69a.jpeg)

#まとめ

今回の記事はこれくらいで終わりにします

長い記事を最後まで読んでくださりありがとうございました。

次回もまた、Pandasについての記事を引き続き書いていきますね。