Python、機械学習

【Python】混乱しやすいソート(sort)の書き方 [リスト、Numpy、Series、DataFrame]

Pythonでプログラミングをしていて意外と混乱してしまうのが、sortの仕方です。

実は「リスト」「numpy配列」「Series」「DataFrame」でソートする時のコードの書き方が微妙に違います。

ソートしようとする度に右往左往しないよう、下記に整理しましたのでご活用ください!

sortの書き方 一覧表

sortの書き方を一覧表にまとめました。これを見れば迷わなくて済むと思います。

  上書きされない書き方(通常はこちら) 上書きするやり方
リスト sorted(〇〇, reverse=True or False) ○○.sort(reverse=True or False)
Numpy
配列

sorted(〇〇, reverse=True or False)
→ リストとして返ってくるので注意。高い順にしたいなら、reverse=Trueにする

np.sort(〇〇)
→ Numpy配列のまま。高い順にしたいなら、[::-1]を末尾につけてnp.sort(〇〇)[::-1]とする。

○○.sort(reverse=True or False)
Series

sorted(〇〇, reverse=True or False)
→ リストとして返ってくるので注意。

np.sort(〇〇)
→ Numpy配列で返ってくるので注意。高い順にしたいなら、[::-1]を末尾につけてnp.sort(〇〇)[::-1]とする。

〇〇.sort_values(ascending=True or False)
→Seriesのまま。高い順にしたいなら、ascending=Falseとする。

DataFrame 〇〇.sort_values(‘カラム名’, ascending=True or False)
→Dataframeのまま。ソートしたいカラムを指定すること。高い順にしたいなら、ascending=Falseとする。

順番について:デフォルトは低い順!

まず、sortのデフォルトは低い順です!つまり、100と50と10という数値があったとしたら、デフォルトでは10, 50, 100の順番になります。

高い順にしたい場合は、表に書いているようにreverse=Trueとしたり、ascending=Falseとしてください。低い順のままでいいなら、わざわざ指定する必要はありません。

なお、reverseは「逆にしますか?」という意味なので、デフォルトの逆である「高い順」にするためにはTrueと答えます。

一方、ascendingは「上昇させますか?」という意味なので、高い値から下降させる「高い順」にするためにはFalseと答えているわけです。

np.sort()のところだけ、[::-1]をつけて順番を変えます。[::-1]という書き方の意味については、こちらの記事をご参照ください。

【Python】リスト、Numpy配列に[::-1]をつけると、順番を逆にできる(逆順にソート)PythonのリストやNumpy配列を逆順に並び替える場面、時々あると思います。 リストやNumpy配列の値の取り出し方のルールを知っ...

上書きするかどうかの違い

たとえば、次のようなリストがあるとします。

list_a = [100, 20, 35, 65, 5, 50]

 

上書きをしない方法だと、変更は反映されません。

下記を見ていただくとわかると思います。

sorted(list_a)

[5, 20, 35, 50, 65, 100]

list_a

[100, 20, 35, 65, 5, 50] ←list_aは上書きされていない

イコールで結ぶ形にすれば、上書きすることができます。

list_a = sorted(list_a)

list_a

[5, 20, 35, 50, 65, 100]

一方、上書きをする書き方だと、イコールで結ぶ書き方をしなくても変更が反映されてしまいます。

list_a.sort()

list_a

[5, 20, 35, 50, 65, 100] ←list_aは上書きされちゃっている

通常、上書きする時はイコールで結ぶやり方をすることが多いと思いますので、.sort()のように上書きをする書き方は避けたほうが無難かも知れません。

無意識のうちに上書きされちゃっている、といった事態になりかねませんので・・・。