sort_values:複数の列を基準にしたソート

複数の列を基準にしてソートすることもできます。下記のようにします。

df.sort_values(列名のリスト)

列名のリストを指定する場合、先に書いた方の列の値が優先されます。

具体例で確認しましょう。

下記の、処理すべきタスク一覧を使います。

TaskNameWorkTimeLimitDate
0資料ABC確認1.52022-04-11
1資料XYZ確認0.52022-04-01
2報告書まとめ1.52022-04-05
3本社ミーティング4.02022-04-04
4出張報告書の提出1.02022-04-05

LimitDateの昇順にソートしたいとします。さらに、LimitDateが同じ場合は、列WorkTimeの昇順にしたいとします。

この場合は、列LimitDateと列WorkTimeを指定します。以下のようにします。

df.sort_values(["LimitDate", "WorkTime"]) リストの形にする
TaskNameWorkTimeLimitDate
1資料XYZ確認0.52022-04-01
3本社ミーティング4.02022-04-04
4出張報告書の提出1.02022-04-05
2報告書まとめ1.52022-04-05
0資料ABC確認1.52022-04-11

2022-04-05のタスクが2つありますが、列WorkTimeの小さい順になっています。

また、複数列を指定した場合、引数ascendingにブール値のリストを指定することで、列ごとに昇順/降順を指定できます。

演習

処理すべきタスク一覧を読み込みます。In [1]:

import pandas as pd

df = pd.read_csv("dataset/task.csv", parse_dates=["LimitDate"], encoding="utf-8")
df

Out[1]:

TaskNameWorkTimeLimitDate
0資料ABC確認1.52022-04-11
1資料XYZ確認0.52022-04-01
2報告書まとめ1.52022-04-05
3本社ミーティング4.02022-04-04
4出張報告書の提出1.02022-04-05

sort_values()に列名のリストを指定すると複数の基準でソートできます。[“LimitDate”, “WorkTime”]を指定すると、列LimitDateの順にソートし、同じ値の場合に列WorkTimeの順にソートします。 2022-04-05のタスクが2つありますが、WorkTimeの小さい順になっています。In [2]:

df.sort_values(["LimitDate", "WorkTime"])

Out[2]:

TaskNameWorkTimeLimitDate
1資料XYZ確認0.52022-04-01
3本社ミーティング4.02022-04-04
4出張報告書の提出1.02022-04-05
2報告書まとめ1.52022-04-05
0資料ABC確認1.52022-04-11

WorkTimeの小さい順にソートし、同じWorkTimeのときにLimitDateの順にしたい場合は、[“WorkTime”, “LimitDate”]を指定します。WorkTimeが1.5のタスクが2つありますが、日付順になっています。In [3]:

df.sort_values(["WorkTime", "LimitDate"])

Out[3]:

TaskNameWorkTimeLimitDate
1資料XYZ確認0.52022-04-01
4出張報告書の提出1.02022-04-05
2報告書まとめ1.52022-04-05
0資料ABC確認1.52022-04-11
3本社ミーティング4.02022-04-04

列ごとに昇順/降順を変えたい場合は、引数ascendingブール値の配列を指定します。 列LimitDate昇順で列WorkTime降順にする場合、[True, False]を指定します。 また、dfを更新するために、inplace=Trueとします。In [4]:

df.sort_values(
    ["LimitDate", "WorkTime"],
    ascending=[True, False],
    inplace=True
)
df

Out[4]:

TaskNameWorkTimeLimitDate
1資料XYZ確認0.52022-04-01
3本社ミーティング4.02022-04-04
2報告書まとめ1.52022-04-05
4出張報告書の提出1.02022-04-05
0資料ABC確認1.52022-04-11

補足

df.nsmallest(N, 列名)を使うと、指定した列の小さい順にN行取得できます。
たとえば、今日中に処理するタスクだけ確認したいとします。
最大3つまで処理可能な場合、すべてをソートせずに列LimitDateの小さいものから3つまでを取得できれば良いでしょう。
このときは、下記のようにできます。

df.nsmallest(3, "LimitDate")
TaskNameWorkTimeLimitDate
1資料XYZ確認0.52022-04-01
3本社ミーティング4.02022-04-04
2報告書まとめ1.52022-04-05

データ件数が多い場合は、上記の方が高速に計算できます。
ちなみに、大きい順に取得したい場合は、df.nlargest(N, 列名)とします。また、sort_values()と同様に、列名の代わりに列名のリストも使えます。

コメント

タイトルとURLをコピーしました