#はじめに
DataFrame のソートに関する内容が日本語では簡単なものしかなかったのでまとめました。あまり需要のないところに触れていきます。
pandas 0.17.1 で動作確認済み。
今回使用するデータはこれです。
import numpy as np
import pandas as pd
if __name__ == "__main__":
df = pd.DataFrame([[1, 3, "北海道"], [4, 5, "東京都"], [3, 5, "埼玉県"], [6, 9, "大阪府"], [1, 1, "青森県"]])
df.index = ["鈴木", "田中", "木村", "遠藤", "吉田"]
df.columns = ["項目1", "項目2", "項目3"]
項目1 | 項目2 | 項目3 | |
---|---|---|---|
鈴木 | 1 | 3 | 北海道 |
田中 | 4 | 5 | 東京都 |
木村 | 3 | 5 | 埼玉県 |
遠藤 | 6 | 9 | 大阪府 |
吉田 | 1 | 1 | 青森県 |
#数値でのソート
この表を項目1で並べようとすると
df.sort_values(by=["項目1"], ascending=True)
とすることで
項目1 | 項目2 | 項目3 | |
---|---|---|---|
鈴木 | 1 | 3 | 北海道 |
吉田 | 1 | 1 | 青森県 |
木村 | 3 | 5 | 埼玉県 |
田中 | 4 | 5 | 東京都 |
遠藤 | 6 | 9 | 大阪府 |
のように項目1の昇順(値が小さい順)に並びます。項目1の値が同じときは元の表での順番に依存して並びます。このときascending=True
をascending=False
に変更すると降順(値が大きい順)に並びます。
元の順ではなく項目2に依存させたいときは
df.sort_values(by=["項目1", "項目2"], ascending=True)
とすることで
項目1 | 項目2 | 項目3 | |
---|---|---|---|
吉田 | 1 | 1 | 青森県 |
鈴木 | 1 | 3 | 北海道 |
木村 | 3 | 5 | 埼玉県 |
田中 | 4 | 5 | 東京都 |
遠藤 | 6 | 9 | 大阪府 |
となります。
多少変則的ですが、項目1を昇順、項目2を降順にしてソートしたいときは
df.sort_values(by=["項目1", "項目2"], ascending=[True,False])
とすることでソートできます。
#文字でのソート
続いて項目3についてのソートをします。先ほどと同様に
df.sort_values(by=["項目3"], ascending=True)
とすると
項目1 | 項目2 | 項目3 | |
---|---|---|---|
鈴木 | 1 | 3 | 北海道 |
木村 | 3 | 5 | 埼玉県 |
遠藤 | 6 | 9 | 大阪府 |
田中 | 4 | 5 | 東京都 |
吉田 | 1 | 1 | 青森県 |
となり、ソートはされるけどもおそらく目的のものとは違ったものになります。ここで揃えたい順のリストを例えば
tdhk = ["北海道", "青森県", "埼玉県", "東京都", "大阪府"]
として
df["項目3"] = pd.Categorical(df["項目3"],tdhk)
を挿入するとリストの順にソートされます。
項目1 | 項目2 | 項目3 | |
---|---|---|---|
鈴木 | 1 | 3 | 北海道 |
吉田 | 1 | 1 | 青森県 |
木村 | 3 | 5 | 埼玉県 |
田中 | 4 | 5 | 東京都 |
遠藤 | 6 | 9 | 大阪府 |