pandasのDataFrameでマルチインデックスにして曜日毎の操作をする
インデックスをdatetime型にしてDataFrameを作成
まずは、インデックスをdatetime型にしてDataFrameを作成します。
DataFrame = pd.read_csv('in.txt',
names=('Date', 'Value'),
index_col='Date',
parse_dates=True)
DataFrame.set_index()でweekday_nameをインデックスに追加設定する
DataFrame.set_index()でweekday_nameをインデックスに追加設定して、マルチインデックスにします。
DataFrameAfter = DataFrame.set_index([DataFrame.index.weekday_name, DataFrame.index])
マルチインデックスしたインデックス名を整理
上記のままだと、曜日のインデックス名が"Date"となっているので、下記のように曜日と日付のインデックス名を設定します。
DataFrameAfter.index.names = ['week', 'date']
sort_index()で、必要に応じて曜日をキーにソート
sort_index()で、必要に応じて曜日をキーにソートします。
DataFrameAfter.sort_index()
曜日毎の総和を出力
あとは、それぞれのメソッドを使って処理するだけです。
sum()で曜日毎の総和を求めます。
print(DataFrameAfter.sum(level='week'))
曜日毎の平均を出力
mean()で曜日毎の平均を求めます。
print(DataFrameAfter.mean(level='week'))
曜日毎の最大値を出力
max()で曜日毎の最大値を求めます。
print(DataFrameAfter.max(level='week'))
曜日毎の最小値を出力
min()で曜日毎の最小値を求めます。
print(DataFrameAfter.min(level='week'))
サンプルコード
サンプルコードになります。
下記のように、in.txtがあったとします。
$ cat in.txt 20150301,0 20150302,1 20150303,2 20150304,3 20150305,4 20150306,5 20150307,6 20150308,7 20150309,8 20150310,9 20150311,10 20150312,11 20150313,12 20150314,13 20150315,14 20150316,15 20150317,16 20150318,17 20150319,18 20150320,19 20150321,20 20150322,21
下記がサンプルコードになります。
$ 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.weekday_name, DataFrame.index])
#インデックスの名前を変更
DataFrameAfter.index.names = ['week', 'date']
#インデックスをキーにソートする
DataFrameAfter.sort_index()
print("曜日毎の総和を出力")
print(DataFrameAfter.sum(level='week'))
print("曜日毎の平均を出力")
print(DataFrameAfter.mean(level='week'))
print("曜日毎の最大値を出力")
print(DataFrameAfter.max(level='week'))
print("曜日毎の最小値を出力")
print(DataFrameAfter.min(level='week'))
下記が実行結果になります。曜日毎の総和・平均・最大値・最小値が一覧できるのが確認できます。
$ ./sample.py
曜日毎の総和を出力
Value
week
Sunday 42
Monday 24
Tuesday 27
Wednesday 30
Thursday 33
Friday 36
Saturday 39
曜日毎の平均を出力
Value
week
Sunday 10.5
Monday 8.0
Tuesday 9.0
Wednesday 10.0
Thursday 11.0
Friday 12.0
Saturday 13.0
曜日毎の最大値を出力
Value
week
Sunday 21
Monday 15
Tuesday 16
Wednesday 17
Thursday 18
Friday 19
Saturday 20
曜日毎の最小値を出力
Value
week
Sunday 0
Monday 1
Tuesday 2
Wednesday 3
Thursday 4
Friday 5
Saturday 6
