2013-06-07 25 views
8

GroupBy Mam następujący DataFrame:Pandy: Kombajny TimeGrouper z innym argumentem

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 

Jak mogę to grupa danych przez Oddział i na okres 20 dni, stosując TimeGrouper?

Wszystkie moje poprzednie próby nie powiodły się, bo nie mógł połączyć się z innym TimeGrouper argumentu w funkcji GroupBy.

Gorąco dziękuję za pomoc.

Dziękuję

Andy

+0

Stosowanie nad DataFrameGroupby od TestGrouper nie wydają się działać w ogóle np 'g = df1.groupby (pd.TimeGrouper (freq = '20D')); g.apply (testgr); ': s Być może warto opublikować github [wydanie] (https://github.com/pydata/pandas/issues/new). –

+0

Witaj Andy, dodałeś linię: from pandas.tseries.resample import TimeGrouper. Zaktualizowałem mój przykład odpowiednio – Andy

+0

Tak, mogę uzyskać dostęp do funkcji, problemem jest groupby nie ma metod .group itp. –

Odpowiedz

4

Z dyskusji tutaj: 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 

i trochę bardziej skomplikowane zapytania

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

można teraz używać do TimeGrouper z innej kolumny (od IIRC pandy 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