データ分析では、データを並べ替えて確認したり処理したりしたい場面があります。
たとえば、次のようなケースです。
- 顧客のデータを、総購入金額が高い順で並べ替えて確認する
- 毎日の売上のデータを、日付が新しい順で並べ替えて確認する
- 試験結果のデータを、点数が高い順で並べ替えて確認する
DataFrameを指定した列でソートするには下記のようにします(df
はDataFrame)。
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 |
各列は下記の通りです。
TaskName
:タスク名WorkTime
:タスクを処理するのにかかる時間LimitDate
:タスクの締め切り日
なお、読み込み時に、列LimitDate
は日付時刻型に変換しているとします。
列LimitDate
でソートした結果は、以下のようになります。
df.sort_values("LimitDate")
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 |
デフォルトでは、昇順にソートします。降順にソートするにはascending=False
をつけます。
また、inplace=True
でdf
自体を変更します。
具体例は写経で確認します。
Seriesでもsort_values()
が使えます。たとえば、列LimitDate
をソートするには、下記のようにします。
df.LimitDate.sort_values()
実行結果
1 2022-04-01
3 2022-04-04
2 2022-04-05
4 2022-04-05
0 2022-04-11
Name: LimitDate, dtype: datetime64[ns]
演習
処理すべきタスク一覧を読み込みます。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 |
このデータは、タスクの登録順に並んでいるため締め切りの日付はバラバラです。 ここでは締め切りの早い順に確認したいとします。 列LimitDate
でソートすればよいので、df.sort_values(“LimitDate”)を使います。日付順に変わることが確認できます。In [2]:
df.sort_values("LimitDate")
Out[2]:
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 |
降順にソートしたい場合は、ascending=False
をつけます。In [3]:
df.sort_values("LimitDate", ascending=False)
Out[3]:
TaskName | WorkTime | LimitDate | |
---|---|---|---|
0 | 資料ABC確認 | 1.5 | 2022-04-11 |
2 | 報告書まとめ | 1.5 | 2022-04-05 |
4 | 出張報告書の提出 | 1.0 | 2022-04-05 |
3 | 本社ミーティング | 4.0 | 2022-04-04 |
1 | 資料XYZ確認 | 0.5 | 2022-04-01 |
ソート結果は一時的なオブジェクトです。df
自体は変更されていません。もう一度df
を確認すると、元の順番のままであることが確認できます。In [4]:
df
Out[4]:
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()
にinplace=True
をつけることで元のDataFrameを変更できます。
df.sort_values("LimitDate", inplace=True) df
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 |
sort_values()
は、Seriesでも使えます。下記は列WorkTime
をソートした結果です。
df.WorkTime.sort_values()
1 0.5 4 1.0 2 1.5 0 1.5 3 4.0 Name: WorkTime, dtype: float64
コメント