ビッグデータを自由自在にソートする

本記事はスキルチェックリストの[データエンジニアリング力 No.78]「数十万レコードのデータに対して、レコード間で特定カラムでのソートができ、数千レコードのデータに対して、カラム間でソートできる」に対応しています。

ある列を基準にソートする

これは疑似データとして作った「顧客管理台帳」です

ロボ千代

 

氏名 氏名(カタカナ) 性別 生年月日 年齢 出身地 血液型
加瀬葉子 カセヨウコ 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
これが2万行くらい続くわけですが、どう思います?

ロボ千代

アイ

控えめに言ってクソ見づらいわね

データがランダムに並んでいるというのは、はっきり言ってとても扱いづらいものです。
まず目的のデータを探すのも一苦労です。

アイ

普通は「年齢順」とか「名前順」とか一定の規則で順番に並べるものよ
今回はPyhonを使ってデータをソートする(順に並べる)方法を勉強しましょう

ロボ千代

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()は非破壊的

ここでちょっと気をつけておかないといけないことがあります。

sort_values()は非破壊的な処理なんです

ロボ千代

アイ

何よ、非破壊的って?カッコつけてないでもっとわかりやすく言ってください
つまり、sort_values()でソートしても、元のDataframeは何も変更されていない(破壊されていない)ってことです

ロボ千代

試しにdf.sort_values()を実行した後にdfを表示してみましょう。

# 年齢順にソート
df.sort_values("年齢")
# 元のdfを表示
df.head()


アイ

確かに何も変わってないわね…
ソートした後のDataframeを保持するには2つの方法があります

ロボ千代

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をきれいにする

アイ

あとちょっと気になることがあるんだけど…
なんでしょう?

ロボ千代

アイ

ソートした後に、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)のように使う
  • ascending=Trueは「昇順」、ascending=Falseは「降順」
    ただし、「昇順」にしたい場合はascending=Trueは省略可能。

  • 複数の列を基準にソートする場合はdf.sort_values([“列名1″,”列名2”,…], ascending=[“True”,”False”,…])のように、列名とascendingをリストで指定する

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です