スポンサーリンク

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

スポンサーリンク