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()でyearをインデックスに追加設定する
DataFrame.set_index()でyearをインデックスに追加設定して、マルチインデックスにします。
DataFrameAfter = DataFrame.set_index([DataFrame.index.year, DataFrame.index])
マルチインデックスしたインデックス名を整理
上記のままだと、年のインデックス名が"Date"となっているので、下記のように年と日付のインデックス名を設定します。
DataFrameAfter.index.names = ['year', 'date']
sort_index()で、必要に応じて年をキーにソート
sort_index()で、必要に応じて年をキーにソートします。
DataFrameAfter.sort_index()
年毎の総和を出力
あとは、それぞれのメソッドを使って処理するだけです。
sum()で年毎の総和を求めます。
print(DataFrameAfter.sum(level='year'))
年毎の平均を出力
mean()で年毎の平均を求めます。
print(DataFrameAfter.mean(level='year'))
年毎の最大値を出力
max()で年毎の最大値を求めます。
print(DataFrameAfter.max(level='year'))
年毎の最小値を出力
min()で年毎の最小値を求めます。
print(DataFrameAfter.min(level='year'))
サンプルコード
サンプルコードになります。
下記のように、in.txtがあったとします。
$ cat in.txt 20110101,0 20110102,1 20120203,2 20120204,3 20120305,4 20130306,5 20130407,6 20130508,7 20140509,8 20140510,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.year, DataFrame.index])
#インデックスの名前を変更
DataFrameAfter.index.names = ['year', 'date']
#インデックスをキーにソートする
DataFrameAfter.sort_index()
print("年毎の総和を出力")
print(DataFrameAfter.sum(level='year'))
print("年毎の平均を出力")
print(DataFrameAfter.mean(level='year'))
print("年毎の最大値を出力")
print(DataFrameAfter.max(level='year'))
print("年毎の最小値を出力")
print(DataFrameAfter.min(level='year'))
下記が実行結果になります。年毎の総和・平均・最大値・最小値が一覧できるのが確認できます。
$ ./sample.py
年毎の総和を出力
Value
year
2011 1
2012 9
2013 18
2014 17
年毎の平均を出力
Value
year
2011 0.5
2012 3.0
2013 6.0
2014 8.5
年毎の最大値を出力
Value
year
2011 1
2012 4
2013 7
2014 9
年毎の最小値を出力
Value
year
2011 0
2012 2
2013 5
2014 8
