2017-01-05 2 views
4

멀티 인덱스 팬더 데이터 프레임이 있는데, 첫 번째 레벨 인덱스는 그룹이고 두 번째 레벨 인덱스는 시간입니다. 내가하고 싶은 일은 각 그룹 내에서 일일 빈도로 리 샘플링하고 일일 관측치의 평균을 취하는 것입니다.멀티 인덱스의 팬더 시간 왜곡

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

덕분에이 내 문제를 해결 많이. 그래서 멀티 인 덱스에서 groupby를 원할 때 필자는 모든 인덱스 레벨을 그룹화 자로 전달해야합니다. 공정한가요? – FLab

+0

네,하지만 두 번째 해결책이 더 많이 사용됩니다. [here] (http://pandas.pydata.org/pandas-docs/stable/whatsnew.html#groupby-syntax-with-window-and-resample-operations)를 참조하십시오.). – jezrael

+0

두 번째 해결 방법으로, kwargs를 resample에서 사용할 수없는이 버그 (pandas 0.19에서 수정 됨)를 강조 할 가치가 있습니다. https://github.com/pandas-dev/pandas/issues/13235 – FLab

관련 문제