2013-09-26 9 views
6

Poniżej znajduje się fragment mojego wyjścia tabeli przestawnej w formacie csv po użyciu pandy pivot_table funkcję:Jak używać pand do grupowania wyników tabeli przestawnej według tygodni?

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 

Jedyną rzeczą, jaką trzeba zrobić jest użycie GroupBy w pand podsumować wartości przez tydzień do każdy Sub Product zanim wyjdę do pliku .csv.

Poniżej znajduje się dane wyjściowe, które chcę, ale odbywa się to w programie Excel. Pierwsza kolumna może nie być dokładnie taka sama, ale nie przeszkadza mi to. Główną rzeczą, którą muszę zrobić, to pogrupować dni po tygodniu, tak aby uzyskać sumę danych za tydzień. (Zobacz, jak w górnym wierszu daty są pogrupowane co 7 dni). Mamy nadzieję, że będziemy mogli to zrobić za pomocą pythona/pand. Czy to możliwe?

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 

Odpowiedz

6

Narzędzie potrzebne jest resample, które niejawnie wykorzystuje GroupBy przez okres czasu/częstotliwości i zastosowanie funkcji takich jak średnie lub sumy.

Odczyt danych.

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 

Konfigurowanie 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 

Parsowanie kolumn jako właściwych dat. (Pochodzą one jako ciągi.)

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 

Resample kolumny (axis=1) tygodniowo ('w'), podsumowując przez tydzień. (how='sum' lub how=np.sum są zarówno ważne opcje tutaj.)

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

można przekazać 'oś = 1'' do resample, aby uniknąć podwójnego transpozycji – Jeff

+0

Neat! Edycja ... –

+0

Dzięki! jednak, co jeśli chcę danych, które rozpoczynają się tydzień zamiast zakończenia tygodnia? Na przykład kolumna daty pozostaje taka, jaka jest, ale wszystkie dane poniżej okresu 2012-11-11 przesuną się w lewo do okresu 2012-11-04? – jxn