スポンサーリンク
pandasのDataFrameでマルチインデックスにして月毎の操作をする
インデックスをdatetime型にしてDataFrameを作成
まずは、インデックスをdatetime型にしてDataFrameを作成します。
参考:pandas.read_csv()のindex_colの指定とparse_dates=Trueで、インデックスの列をdatetime型に変換
DataFrame = pd.read_csv('in.txt', names=('Date', 'Value'), index_col='Date', parse_dates=True)
スポンサーリンク
DataFrame.set_index()でmonthをインデックスに追加設定する
DataFrame.set_index()でmonthをインデックスに追加設定して、マルチインデックスにします。
DataFrameAfter = DataFrame.set_index([DataFrame.index.month, DataFrame.index])
マルチインデックスしたインデックス名を整理
上記のままだと、月のインデックス名が"Date"となっているので、下記のように月と日付のインデックス名を設定します。
DataFrameAfter.index.names = ['month', 'date']
sort_index()で、必要に応じて月をキーにソート
sort_index()で、必要に応じて月をキーにソートします。
DataFrameAfter.sort_index()
月毎の総和を出力
あとは、それぞれのメソッドを使って処理するだけです。
sum()で月毎の総和を求めます。
print(DataFrameAfter.sum(level='month'))
月毎の平均を出力
mean()で月毎の平均を求めます。
print(DataFrameAfter.mean(level='month'))
月毎の最大値を出力
max()で月毎の最大値を求めます。
print(DataFrameAfter.max(level='month'))
月毎の最小値を出力
min()で月毎の最小値を求めます。
print(DataFrameAfter.min(level='month'))
サンプルコード
サンプルコードになります。
下記のように、in.txtがあったとします。
$ cat in.txt 20010101,0 20010102,1 20010203,2 20010204,3 20010305,4 20010306,5 20010407,6 20010508,7 20010509,8 20010510,9
下記がサンプルコードになります。
$ cat sample.py #!/usr/bin/env python3 # coding: UTF-8 import pandas as pd DataFrame = pd.read_csv('in.txt', names=('Date', 'Value'), index_col='Date', parse_dates=True) #マルチインデックスを設定 DataFrameAfter = DataFrame.set_index([DataFrame.index.month, DataFrame.index]) #インデックスの名前を変更 DataFrameAfter.index.names = ['month', 'date'] #インデックスをキーにソートする DataFrameAfter.sort_index() print("月毎の総和を出力") print(DataFrameAfter.sum(level='month')) print("月毎の平均を出力") print(DataFrameAfter.mean(level='month')) print("月毎の最大値を出力") print(DataFrameAfter.max(level='month')) print("月毎の最小値を出力") print(DataFrameAfter.min(level='month'))
下記が実行結果になります。月毎の総和・平均・最大値・最小値が一覧できるのが確認できます。
$ ./sample.py 月毎の総和を出力 Value month 1 1 2 5 3 9 4 6 5 24 月毎の平均を出力 Value month 1 0.5 2 2.5 3 4.5 4 6.0 5 8.0 月毎の最大値を出力 Value month 1 1 2 3 3 5 4 6 5 9 月毎の最小値を出力 Value month 1 0 2 2 3 4 4 6 5 7
スポンサーリンク