2017-01-05 9 views
4

私はマルチインデックスpandasデータフレームを持っています。第1レベルのインデックスはグループで、第2レベルのインデックスは時間です。 私がしたいことは、各グループ内で、日中の観測の平均を取って、毎日の頻度に再サンプリングすることです。マルチインデックスのパンダタイムグルーファー

import pandas as pd 
import numpy as np 

data = pd.concat([pd.DataFrame([['A']*72, list(pd.date_range('1/1/2011', periods=72, freq='H')), list(np.random.rand(72))], index = ['Group', 'Time', 'Value']).T, 
        pd.DataFrame([['B']*72, list(pd.date_range('1/1/2011', periods=72, freq='H')), list(np.random.rand(72))], index = ['Group', 'Time', 'Value']).T, 
        pd.DataFrame([['C']*72, list(pd.date_range('1/1/2011', periods=72, freq='H')), list(np.random.rand(72))], index = ['Group', 'Time', 'Value']).T], 
        axis = 0).set_index(['Group', 'Time']) 

これは私がこれまで試したものです:

daily_counts = data.groupby(pd.TimeGrouper('D'), level = ['Time']).mean() 

しかし、私は次のエラーを取得:

TypeError: Only valid with DatetimeIndex, TimedeltaIndex or PeriodIndex, but got an instance of 'MultiIndex' 

任意のアイデアはどのようにこの問題を解決するために?

答えて

6

あなたがfloatに最初のキャストの列を必要とし、その後Grouperを使用します。

data['Value'] = data['Value'].astype(float) 
daily_counts = data.groupby([pd.TimeGrouper('D', level='Time'), 
          pd.Grouper(level='Group')])['Value'].mean() 

print (daily_counts) 
Time  Group 
2011-01-01 A  0.548358 
      B  0.612878 
      C  0.544822 
2011-01-02 A  0.529880 
      B  0.437062 
      C  0.388626 
2011-01-03 A  0.563854 
      B  0.479299 
      C  0.557190 
Name: Value, dtype: float64 

別の解決策:

data = data.reset_index(level='Group') 
print (data.groupby('Group').resample('D')['Value'].mean()) 
+0

おかげで多く、これは私の問題を解決しました。 だから私は、主なテイクアウェイは、私がMultiIndexでgroupbyしたいとき、私はまだすべてのインデックスレベルをグループ化する必要があるということです。それは公正ですか? – FLab

+0

はい、おそらくもっと一般的な使用の2番目の解決策です[こちら](http://pandas.pydata.org/pandas-docs/stable/whatsnew.html#groupby-syntax-with-window-and-resample-operationsを参照してください) )。 – jezrael

+0

2番目の解決策では、このバグをハイライトする価値があります(パンダ0.19で修正されています)。これは、resampleでkwargsを使用できない可能性があります:https://github.com/pandas-dev/pandas/issues/13235 – FLab

関連する問題