2013-09-26 5 views
6

Qui di seguito è un frammento della mia produzione tabella pivot in formato .csv dopo aver utilizzato la funzione panda tabella_pivot:Come utilizzare i panda per raggruppare i risultati della tabella pivot per settimana?

Sub-Product  11/1/12 11/2/12 11/3/12 11/4/12 11/5/12 11/6/12 
GP Acquisitions 164 168  54  72  203 167 
GP Applications 190 207  65  91  227 200 
GPF Acquisitions 1124 1142 992 1053 1467 1198 
GPF Applications 1391 1430 1269 1357 1855 1510 

L'unica cosa che dobbiamo fare ora è quello di utilizzare groupby in panda di riassumere i valori per settimana per ogni prodotto secondario prima di inviarlo a un file .csv.

Di seguito è l'output che voglio, ma è fatto in Excel. La prima colonna potrebbe non essere esattamente la stessa, ma io sto bene con quello. La cosa principale che devo fare è raggruppare i giorni per settimana in modo da poter ottenere la somma dei dati per settimana. (Guarda come la riga in alto ha le date raggruppate ogni 7 giorni). Sperando di poterlo fare usando python/panda. È possibile?

Row Labels 11/4/12 - 11/10/12  11/11/12 - 11/17/12 
GP  
Acquisitions  926      728 
Applications  1092      889 
GPF  
Acquisitions  8206      6425 
Applications  10527      8894 

risposta

6

lo strumento necessario è resample, che utilizza implicitamente groupby nel corso di un periodo di tempo/frequenza e applica una funzione come media o somma.

Leggi dati.

In [2]: df 
Out[2]: 
     Sub-Product 11/1/12 11/2/12 11/3/12 11/4/12 11/5/12 11/6/12 
GP Acquisitions  164  168  54  72  203  167 
GP Applications  190  207  65  91  227  200 
GPF Acquisitions  1124  1142  992  1053  1467  1198 
GPF Applications  1391  1430  1269  1357  1855  1510 

Impostare un MultiIndex.

In [4]: df = df.reset_index().set_index(['index', 'Sub-Product']) 

In [5]: df 
Out[5]: 
        11/1/12 11/2/12 11/3/12 11/4/12 11/5/12 11/6/12 
index Sub-Product              
GP Acquisitions  164  168  54  72  203  167 
     Applications  190  207  65  91  227  200 
GPF Acquisitions  1124  1142  992  1053  1467  1198 
     Applications  1391  1430  1269  1357  1855  1510 

analizzare le colonne come datetimes adeguate. (Essi sono disponibili in forma di stringhe.)

In [6]: df.columns = pd.to_datetime(df.columns) 

In [7]: df 
Out[7]: 
        2012-11-01 2012-11-02 2012-11-03 2012-11-04 \ 
index Sub-Product              
GP Acquisitions   164   168   54   72 
     Applications   190   207   65   91 
GPF Acquisitions  1124  1142   992  1053 
     Applications  1391  1430  1269  1357 

        2012-11-05 2012-11-06 
index Sub-Product       
GP Acquisitions   203   167 
     Applications   227   200 
GPF Acquisitions  1467  1198 
     Applications  1855  1510 

Ricampiona le colonne (axis=1) settimanali ('w'), sommando alla settimana. (how='sum' o how=np.sum sono entrambe le opzioni valide qui.)

In [10]: df.resample('w', how='sum', axis=1) 
Out[10]: 
        2012-11-04 2012-11-11 
index Sub-Product       
GP Acquisitions   458   370 
     Applications   553   427 
GPF Acquisitions  4311  2665 
     Applications  5447  3365 
+2

si può passare '' asse = 1'' per ricampionare, al fine di evitare la doppia recepimento – Jeff

+0

Neat! Modifica ... –

+0

Grazie! tuttavia, che cosa succede se voglio i dati che iniziano la settimana anziché la settimana? Ad esempio, la colonna della data rimane com'è, ma tutti i dati al di sotto del 2012-11-11 si sposteranno a sinistra per essere sotto 2012-11-04? – jxn