PandasのDataFrameを日付でソートする方法

Pandas は非常に人気のあるデータ操作・分析ライブラリです。

多くの人がデータセットを読み込んで分析するためのツールです。

データを正しくソートすることは、データ分析に関する多くのタスクで重要な要素です。

このチュートリアルでは、Pandas DataFrameを日付でソートする方法について見ていきます。

まず、いくつかの日付を含む単純な DataFrame を作成することから始めましょう。

import pandas as pd


data = {'Name':["John", "Paul", "Dhilan", "Bob", "Henry"], 
'Date of Birth': ["01/06/86", "05/10/77", "11/12/88", "25/12/82", "01/06/86"]}
df = pd.DataFrame(data)


print(df)


デフォルトでは、出力は DataFrame のインデックスでソートされます。

    Name Date of Birth
0    John      01/06/86
1    Paul      05/10/77
2  Dhilan      11/12/88
3     Bob      25/12/82
4   Henry      01/06/86


よく見ると、John と Paul の生年月日が同じであることに気がつくかもしれません。

Pandasのデータフレームで文字列を日付に変換する。

生年月日`を日付形式で入力し、そのようにフォーマットされているように見えます。

しかし、最初にしなければならないことは、Pandasがこの日付が実際に日付であることを認識し、理解することです。

Pandas が DataFrame にデータを格納し、操作する方法は、そのデータ型によって決定されます。

各値のデータ型は、それがどのようなものであるかに基づいて、自動的に割り当てられます。

60には整数型が割り当てられ、John` には文字列型が割り当てられます。

それでは、各カラムの現在のデータ型を確認してみましょう。

print(df.dtypes)


これで、データ型のリストができました。

Name             object
Date of Birth    object
dtype: object


生年月日`カラムには、デフォルトで基本的な文字列オブジェクトの型が割り当てられていることがわかります。

しかし、日付を正しくソート、分析、操作するためには、Pandasがこのカラムに日付が含まれていることを認識する必要があります。

そこで、Date of Birth カラムのデータ型を object 型から datetime 型に明示的に変更することにしましょう。

これを行う最も簡単な方法は、 to_datetime() 関数を使用することです。

df["Date of Birth"] = pd.to_datetime(df["Date of Birth"])
print(df.dtypes)


さて、出力を確認してみましょう。

Name                     object
Date of Birth    datetime64[ns]
dtype: object


このように、データ型を datetime に変更することに成功していることがわかります。

別の方法として、カラムのデータ型を手動で指定することもできます。

df["Date of Birth"] = df["Date of Birth"].astype('datetime64[ns]')


出力します。

出力: “`
Name object
Date of Birth datetime64[ns]
dtype: object


これらのメソッドはどちらも同じ結果をもたらしますが、この目的のために設計された `to_datetime()` メソッドが推奨されます。



### PandasでDataFrameを日付順に並べ替える

N

### Pandas で DataFrame を日付でソートする

Pandas がデータ型を正しく認識したところで、`DataFrame` をソートしてみましょう。

注意: これから使用するすべてのメソッドは、インプレースソートを行わないので、変更した `DataFrame` を新しい (または同じ) 参照変数に再アサインして変更を保持するか、`inplace` 引数を使用してデフォルトの動作を変更する必要があります。



### 単一日付カラムで降順にソートする

sort_values()` 関数を呼び出す際に `ascending` 引数を `False` に設定すると、ソートの順序を降順に変更することができます。

df.sort_values(by=’Date of Birth’, inplace=True)
print(df)


今度は降順でソートされます。つまり、直近のデータがリストの一番上に表示されることになります。John と Henry は誕生日が同じなので、この場合もインデックス番号で並べ替えられます。

Name    Date of Birth

1 Paul 1977-05-10
3 Bob 1982-12-25
0 John 1986-01-06
4 Henry 1986-01-06
2 Dhilan 1988-11-12




### 複数の日付カラムでソートする

では、複数の日付カラムでソートしたい場合はどうすればいいのでしょうか?

それでは、`DataFrame`に別の日付カラムを追加して、両方のデータ型が正しく割り当てられていることを確認しましょう。

df = df.sort_values(by=’Date of Birth’)


さて、うまくいくかどうか見てみましょう。

df.sort_values(by=’Date of Birth’, ascending = False, inplace=True)




#### 複数の日付カラムで昇順にソートする

DataFrame` を `Date of Birth` と `Employment Start` の両方で昇順にソートするには、 `sort_values()` メソッドに両方のカラム名を追加するだけです。ソートの優先順位は、どちらのカラムが先に入力されたかによって決まることを覚えておいてください。

Name    Date of Birth

2 Dhilan 1988-11-12
0 John 1986-01-06
4 Henry 1986-01-06
3 Bob 1982-12-25
1 Paul 1977-05-10


このメソッドのデフォルトは昇順なので、出力は次のようになります。

Values for the new column

employment_start = [“22/05/16”, “17/08/10”, “22/05/16”, “11/06/19”, “16/06/05”]

Adding columns to DataFrame

df[‘Employment Start’] = employment_start

Applying to_datetime() function to multiple columns at once

df[[‘Date of Birth’, ‘Employment Start’]] = df[[‘Date of Birth’, ‘Employment Start’]].apply(pd.to_datetime)

print(df.dtypes)
print(df)


生年月日`はこのメソッドで最初に入力されたカラムなので、Pandasはそれを優先しています。John と Henry は同じ `Date of Birth` を持っているので、代わりに `Employment Start` カラムでソートされます。



#### 複数の日付カラムで降順にソートする

単一列のソートと同様に、`ascending`パラメータを`False`に変更することで、降順に変更することができます。

Name object
Date of Birth datetime64[ns]
Employment Start datetime64[ns]
dtype: object

Name Date of Birth Employment Start
0 John 1986-01-06 2016-05-22
1 Paul 1977-05-10 2010-08-17
2 Dhilan 1988-11-12 2016-05-22
3 Bob 1982-12-25 2019-11-06
4 Henry 1986-01-06 2005-06-16


これで、降順での出力は次のようになります。

df.sort_values(by=[‘Date of Birth’, ‘Employment Start’], inplace=True)


降順で表示されているため、JohnとHenryの両方がリストの上位に表示されていることがわかります。しかし今回は、ジョンの方が「雇用開始日」が新しいため、ヘンリーよりも優先されます。



#### 複数の日付カラムによるソートと可変順序ソート

さて、複数のカラムを使ってソートするだけでなく、これらのカラムを異なる昇順基準でソートしたい場合はどうすれば良いでしょうか?Pandasでは、これまでと同じ `sort_values()` メソッドでこれを実装することができます。この場合、 `ascending` パラメータに適切な値のリストを渡すだけでよいのです。

この例では、`Employment Start` を昇順、つまり勤続年数の長い方から並べ、次に `Date of Birth` を降順、つまり若い方から並べたい場合を考えてみましょう。

Name    Date of Birth   Employment Start

1 Paul 1977-05-10 2010-08-17
3 Bob 1982-12-25 2019-11-06
4 Henry 1986-01-06 2005-06-16
0 John 1986-01-06 2016-05-22
2 Dhilan 1988-11-12 2016-05-22


これは、このメソッドで最初に渡されたカラムであるため、優先的に処理されます。次に、「生年月日」を降順で並べ替えます。Dhilan と John は同じ `Employment Start` の日付を持っているので、Dhilan は John よりも若いので、優先されます。

df.sort_values(by=[‘Date of Birth’, ‘Employment Start’], ascending = False, inplace=True)

“`

結論

Pandasライブラリの人気を考えると、カラムに基づいたデータのソートが簡単な処理であることは驚くことではありません。

今回は sort_values() メソッドの柔軟性について、単一列、複数列、昇順、降順、さらには可変長に渡って見てきました。

今回は日付によるソートに焦点を当てましたが、このメソッドはさまざまなデータ型に対して使用することができます。

特に日付でソートする場合は、まず最初に、そして間違いなく最も重要なステップは、データに datetime 型が正しく割り当てられていることを確認することです。

データ型を正しく定義しないと、Pandasが日付を認識できない危険性があります。

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