2013-06-07 29 views
8

Ho il seguente dataframe:Pandas: Combinare TimeGrouper con un altro argomento 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 

come posso gruppo di questi dati da parte del Branch e su un periodo di 20 giorni utilizzando TimeGrouper?

Tutti i miei precedenti tentativi non sono riusciti, perché non è stato possibile combinare TimeGrouper con un altro argomento nella funzione groupby.

Apprezzerei molto il vostro aiuto.

Grazie

Andy

+0

Applicazione di più di un DataFrameGroupby da TestGrouper non sembra funzionare affatto per esempio 'g = df1.groupby (pd.TimeGrouper (freq = '20D')); g.apply (testgr); ': s Forse vale la pena postare un github [problema] (https://github.com/pydata/pandas/issues/new). –

+0

Ciao Andy, hai aggiunto la linea: da pandas.tseries.resample import TimeGrouper. Ho aggiornato il mio esempio di conseguenza – Andy

+0

Sì, posso accedere alla funzione, il problema è che groupby non ha metodi .group, ecc. –

risposta

4

Dalla discussione qui: 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 

E un po 'questione più complicata

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

È ora possibile utilizzare un TimeGrouper con un'altra colonna (a partire da IIRC panda 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 
Problemi correlati