2013-06-07 2 views
8

У меня есть следующий DataFrame:Панда: зерноуборочный TimeGrouper с другим аргументом GroupBy

df = pd.DataFrame({ 
'Branch' : 'A A A A A B'.split(), 
'Buyer': 'Carl Mark Carl Joe Joe Carl'.split(), 
'Quantity': [1,3,5,8,9,3], 
'Date' : [ 
DT.datetime(2013,1,1,13,0), 
DT.datetime(2013,1,1,13,5), 
DT.datetime(2013,10,1,20,0), 
DT.datetime(2013,10,2,10,0), 
DT.datetime(2013,12,2,12,0),          
DT.datetime(2013,12,2,14,0), 
]}) 

from pandas.tseries.resample import TimeGrouper 

Как я группа этого данные Сектора и на 20-дневной период с использованием TimeGrouper?

Все мои предыдущие попытки не удались, потому что я не мог комбинировать TimeGrouper с другим аргументом в функции groupby.

Буду признателен Вам за вашу помощь.

Спасибо

Энди

+0

Применение по DataFrameGroupby от TestGrouper, кажется, не работает вообще, например, 'g = df1.groupby (pd.TimeGrouper (freq = '20D')); g.apply (testgr); ': s Возможно, стоит опубликовать github [issue] (https://github.com/pydata/pandas/issues/new). –

+0

Привет, Энди, добавили ли вы строку: из pandas.tseries.resample импортируйте TimeGrouper. Я обновил свой пример соответственно – Andy

+0

Да, я могу получить доступ к функции, проблема в том, что groupby не имеет методов .group и т. Д. –

ответ

4

Из обсуждения здесь: https://github.com/pydata/pandas/issues/3791

In [38]: df.set_index('Date').groupby(pd.TimeGrouper('6M')).apply(lambda x: x.groupby('Branch').sum()) 
Out[38]: 
        Quantity 
      Branch   
2013-01-31 A    4 
2014-01-31 A    22 
      B    3 

И немного более сложный вопрос

In [55]: def testf(df): 
    ....:  if (df['Buyer'] == 'Mark').sum() > 0: 
    ....:   return Series(dict(quantity = df['Quantity'].sum(), buyer = 'mark')) 
    ....:  return Series(dict(quantity = df['Quantity'].sum()*100, buyer = 'other')) 
    ....: 

In [56]: df.set_index('Date').groupby(pd.TimeGrouper('6M')).apply(lambda x: x.groupby('Branch').apply(testf)) 
Out[56]: 
        buyer quantity 
      Branch     
2013-01-31 A  mark  4 
2014-01-31 A  other  2200 
      B  other  300 
14

Теперь вы можете использовать TimeGrouper с другой колонке (по состоянию на IIRC панды version 0.14):

In [11]: df1 = df.set_index('Date') 

In [12]: g = df1.groupby([pd.TimeGrouper('20D'), 'Branch']) 

In [13]: g.sum() 
Out[13]: 
          Quantity 
Date    Branch 
2013-01-01 13:00:00 A    4 
2013-09-18 13:00:00 A    13 
2013-11-17 13:00:00 A    9 
        B    3 
Смежные вопросы