複数の列を基準にしてソートすることもできます。下記のようにします。
df.sort_values(列名のリスト)
列名のリストを指定する場合、先に書いた方の列の値が優先されます。
具体例で確認しましょう。
下記の、処理すべきタスク一覧を使います。
TaskName | WorkTime | LimitDate | |
---|---|---|---|
0 | 資料ABC確認 | 1.5 | 2022-04-11 |
1 | 資料XYZ確認 | 0.5 | 2022-04-01 |
2 | 報告書まとめ | 1.5 | 2022-04-05 |
3 | 本社ミーティング | 4.0 | 2022-04-04 |
4 | 出張報告書の提出 | 1.0 | 2022-04-05 |
列LimitDate
の昇順にソートしたいとします。さらに、列LimitDate
が同じ場合は、列WorkTime
の昇順にしたいとします。
この場合は、列LimitDate
と列WorkTime
を指定します。以下のようにします。
df.sort_values(["LimitDate", "WorkTime"]) リストの形にする
TaskName | WorkTime | LimitDate | |
---|---|---|---|
1 | 資料XYZ確認 | 0.5 | 2022-04-01 |
3 | 本社ミーティング | 4.0 | 2022-04-04 |
4 | 出張報告書の提出 | 1.0 | 2022-04-05 |
2 | 報告書まとめ | 1.5 | 2022-04-05 |
0 | 資料ABC確認 | 1.5 | 2022-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]:
TaskName | WorkTime | LimitDate | |
---|---|---|---|
0 | 資料ABC確認 | 1.5 | 2022-04-11 |
1 | 資料XYZ確認 | 0.5 | 2022-04-01 |
2 | 報告書まとめ | 1.5 | 2022-04-05 |
3 | 本社ミーティング | 4.0 | 2022-04-04 |
4 | 出張報告書の提出 | 1.0 | 2022-04-05 |
sort_values()
に列名のリストを指定すると複数の基準でソートできます。[“LimitDate”, “WorkTime”]を指定すると、列LimitDate
の順にソートし、同じ値の場合に列WorkTime
の順にソートします。 2022-04-05のタスクが2つありますが、WorkTime
の小さい順になっています。In [2]:
df.sort_values(["LimitDate", "WorkTime"])
Out[2]:
TaskName | WorkTime | LimitDate | |
---|---|---|---|
1 | 資料XYZ確認 | 0.5 | 2022-04-01 |
3 | 本社ミーティング | 4.0 | 2022-04-04 |
4 | 出張報告書の提出 | 1.0 | 2022-04-05 |
2 | 報告書まとめ | 1.5 | 2022-04-05 |
0 | 資料ABC確認 | 1.5 | 2022-04-11 |
WorkTime
の小さい順にソートし、同じWorkTime
のときにLimitDate
の順にしたい場合は、[“WorkTime”, “LimitDate”]を指定します。WorkTime
が1.5のタスクが2つありますが、日付順になっています。In [3]:
df.sort_values(["WorkTime", "LimitDate"])
Out[3]:
TaskName | WorkTime | LimitDate | |
---|---|---|---|
1 | 資料XYZ確認 | 0.5 | 2022-04-01 |
4 | 出張報告書の提出 | 1.0 | 2022-04-05 |
2 | 報告書まとめ | 1.5 | 2022-04-05 |
0 | 資料ABC確認 | 1.5 | 2022-04-11 |
3 | 本社ミーティング | 4.0 | 2022-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]:
TaskName | WorkTime | LimitDate | |
---|---|---|---|
1 | 資料XYZ確認 | 0.5 | 2022-04-01 |
3 | 本社ミーティング | 4.0 | 2022-04-04 |
2 | 報告書まとめ | 1.5 | 2022-04-05 |
4 | 出張報告書の提出 | 1.0 | 2022-04-05 |
0 | 資料ABC確認 | 1.5 | 2022-04-11 |
補足
df.nsmallest(N, 列名)
を使うと、指定した列の小さい順にN行取得できます。
たとえば、今日中に処理するタスクだけ確認したいとします。
最大3つまで処理可能な場合、すべてをソートせずに列LimitDate
の小さいものから3つまでを取得できれば良いでしょう。
このときは、下記のようにできます。
df.nsmallest(3, "LimitDate")
TaskName | WorkTime | LimitDate | |
---|---|---|---|
1 | 資料XYZ確認 | 0.5 | 2022-04-01 |
3 | 本社ミーティング | 4.0 | 2022-04-04 |
2 | 報告書まとめ | 1.5 | 2022-04-05 |
データ件数が多い場合は、上記の方が高速に計算できます。
ちなみに、大きい順に取得したい場合は、df.nlargest(N, 列名)
とします。また、sort_values()
と同様に、列名の代わりに列名のリストも使えます。
コメント