ある列を基準にソートする
ロボ千代
氏名 | 氏名(カタカナ) | 性別 | 生年月日 | 年齢 | 出身地 | 血液型 |
加瀬葉子 | カセヨウコ | 女 | 1999/12/31 | 20 | 千葉県 | O |
角田健二 | カクタケンジ | 男 | 1996/4/19 | 23 | 山梨県 | O |
安斉亜依彩 | アンザイアイサ | 女 | 1998/6/26 | 21 | 岩手県 | B |
湯川大地 | ユカワダイチ | 男 | 1966/5/24 | 53 | 兵庫県 | O |
松尾千紘 | マツオチヒロ | 女 | 1984/1/12 | 36 | 福島県 | O |
小野寺雪菜 | オノデラユキナ | 女 | 1964/10/5 | 55 | 島根県 | B |
金城葉奈 | カナシロハナ | 女 | 1993/3/19 | 26 | 徳島県 | O |
三原寿男 | ミハラトシオ | 男 | 1976/5/20 | 43 | 静岡県 | A |
雨宮芳太郎 | アメミヤヨシタロウ | 男 | 1971/4/27 | 48 | 山形県 | B |
比嘉唯 | ヒガユイ | 女 | 1975/9/10 | 44 | 山口県 | AB |
東野綾香 | ヒガシノアヤカ | 女 | 1964/4/8 | 55 | 滋賀県 | A |
黒木一宏 | クロキカズヒロ | 男 | 1976/4/3 | 43 | 大分県 | AB |
住田澄子 | スミダスミコ | 女 | 1981/5/29 | 38 | 栃木県 | A |
丸田浩秋 | マルタヒロアキ | 男 | 1987/4/20 | 32 | 鹿児島県 | A |
喜多勝次 | キタカツジ | 男 | 1970/8/27 | 49 | 香川県 | B |
岡山直樹 | オカヤマナオキ | 男 | 1967/12/24 | 52 | 愛媛県 | AB |
河崎威雄 | カワサキタケオ | 男 | 1981/1/27 | 39 | 熊本県 | O |
荒木亜矢 | アラキアヤ | 女 | 1979/12/29 | 40 | 新潟県 | A |
倉持愛実 | クラモチマナミ | 女 | 1993/11/14 | 26 | 愛知県 | A |
畠中昭吉 | ハタナカショウキチ | 男 | 1986/1/16 | 34 | 大分県 | B |
武井知里 | タケイチサト | 女 | 1990/10/12 | 29 | 山形県 | O |
臼井伸子 | ウスイノブコ | 女 | 1978/7/5 | 41 | 和歌山県 | B |
水上結依 | ミズカミユイ | 女 | 1979/3/18 | 40 | 福島県 | A |
… | … | … | … | … | … | … |
ロボ千代
アイ
データがランダムに並んでいるというのは、はっきり言ってとても扱いづらいものです。
まず目的のデータを探すのも一苦労です。
アイ
ロボ千代
sort_values()を覚えよう
まずは、いつものようにDataframeを読み込んでみましょう。
import pandas as pd
df = pd.read_csv("personal_info.csv")
df.head()
次はいよいよソートです。
Dataframeのソートはsort_values()というメソッドを覚えておけば十分です。
sort_values()の引数にソートしたい列名を指定します。
# 年齢順にソート
df.sort_values("年齢")
デフォルトでは「昇順」になります。
「降順」にソートしたい場合は、sort_values()にascending=Falseと指定します。
ascendingとは「昇順」のことで、「ascending=False」は「昇順ではない」つまり「降順」と指定するんですね。
# 年齢順にソート(降順)
df.sort_values("年齢", ascending=False)
アイ
昇順=小さいものから大きいものへ並べる順序。データが小から大へ昇っていくイメージ。
降順=大きいものから小さいものへ並べる順序。データが大から小へ降りていくイメージ。
と覚えてみるといいですよ。
sort_values()は非破壊的
ここでちょっと気をつけておかないといけないことがあります。
ロボ千代
アイ
ロボ千代
試しにdf.sort_values()を実行した後にdfを表示してみましょう。
# 年齢順にソート
df.sort_values("年齢")
# 元のdfを表示
df.head()
アイ
ロボ千代
1. sort_values()を破壊的に呼ぶ
sort_values()にinplace=Trueを指定すると、元のDataframe自体をソートすることができます。
“inplace”というのは”その場で”というような意味です。
アイ
# 年齢順にソート(破壊的)
df.sort_values("年齢", inplace=True)
# 元のdfを表示
df.head()
2. sort_values()の結果を新しいDataframeに代入する
1の方法だと元のDataframe自体が書き換えられてしまうので、そうしたくない場合は新しいDataframeを用意して、そこにsort_values()の結果を代入すればいいです。
# 年齢順にソート
df_sorted = df.sort_values("年齢", inplace=True)
indexをきれいにする
アイ
ロボ千代
アイ
なんとかならない?

ソートした後はDataframeのindexがぐちゃぐちゃになってしまいます。
これが気持ち悪い!という場合は、reset_index()を使えば、indexを振り直すことができます。
このreset_index()も非破壊的なメソッドなので、先述の1か2の方法を使わないとダメです。
df.reset_index(inplace=True)
ここから少し応用的なソートの仕方を紹介しますよ。
ロボ千代
複数の列でソートする
ここまでは1つの列を基準にしてソートする方法を紹介してきました。
ただ、1つの列だけではなく複数の列を基準にしてソートしたいというケースも多々あります。
特にビッグデータのようにデータの数が多い場合、例えば、”年齢”でソートしたとしても、同じ年齢の人が数百人もいることもざらにあります。
その同年齢の集団の中でさらに別の基準(例えば、”血液型”)でソートしたい、という場合も多いのです。
複数の列でもsort_values()
複数の列を基準にしてソートする場合もsort_values()を使います。
基準となる列をリストとして指定すればOKです。
どのようにソートされるのかわかりやすいようにサンプルデータ(df_example)を使って見ていきましょう。
df_example.sort_values(["年齢","血液型"])
df_example.sort_values([“年齢”,”血液型”])
のようにソートの基準となる列をリストで指定します。
このとき、リストで与えた列の最初のものから順番にソートされていきます。
ロボ千代
df_example.sort_values(["年齢","血液型"])
とした場合、まず”年齢”でソートされ、さらに同じ年齢のデータの中で”血液型”でソートされます。
df_example.sort_values(["血液型","年齢"])
とした場合は、まず”血液型”でソートされ、さらに同じ血液型のデータの中で”年齢”でソートされます。
列ごとに昇順・降順を指定する
複数の列を基準にソートする場合、列ごとに昇順・降順を指定したい場合もあると思います。
アイ
その場合もascendingで指定します。ascendingには列ごとのTrue,Falseをリストとして指定します。
例えば、”年齢”は「昇順」、”血液”は「降順」にしたい場合は、次のように指定します。
df.sort_values(["年齢","血液型"], ascending=[True, False])
まとめ
- Dataframeをソートするにはdf.sort_values()
- df.sort_values(“ソートの基準になる列名”, ascending=False)のように使う
- 複数の列を基準にソートする場合はdf.sort_values([“列名1″,”列名2”,…], ascending=[“True”,”False”,…])のように、列名とascendingをリストで指定する
ascending=Trueは「昇順」、ascending=Falseは「降順」
ただし、「昇順」にしたい場合はascending=Trueは省略可能。
コメントを残す