2013-03-22 10 views
30

Używam Pandy 0.10.1Pandy Tabele przestawne row podgrup

Biorąc pod uwagę to Dataframe:

Date  State City SalesToday SalesMTD SalesYTD 
20130320  stA ctA   20  400  1000 
20130320  stA ctB   30  500  1100 
20130320  stB ctC   10  500  900 
20130320  stB ctD   40  200  1300 
20130320  stC ctF   30  300  800 

Jak mogę grupy podgrup na stanie?

State City SalesToday SalesMTD SalesYTD 
    stA ALL   50  900  2100 
    stA ctA   20  400  1000 
    stA ctB   30  500  1100 

Próbowałem ze stołem obrotowym, ale mogę tylko mieć sum w kolumnach

table = pivot_table(df, values=['SalesToday', 'SalesMTD','SalesYTD'],\ 
        rows=['State','City'], aggfunc=np.sum, margins=True) 

można to osiągnąć na Excel, ze stołem obrotowym.

Odpowiedz

36

Jeśli ustawisz Państwo i miasto nie w obu wierszach, otrzymasz oddzielne marginesy. Przekształć i otrzymasz stolik, którego szukasz:

In [10]: table = pivot_table(df, values=['SalesToday', 'SalesMTD','SalesYTD'],\ 
        rows=['State'], cols=['City'], aggfunc=np.sum, margins=True) 


In [11]: table.stack('City') 
Out[11]: 
      SalesMTD SalesToday SalesYTD 
State City         
stA All  900   50  2100 
     ctA  400   20  1000 
     ctB  500   30  1100 
stB All  700   50  2200 
     ctC  500   10  900 
     ctD  200   40  1300 
stC All  300   30  800 
     ctF  300   30  800 
All All  1900   130  5100 
     ctA  400   20  1000 
     ctB  500   30  1100 
     ctC  500   10  900 
     ctD  200   40  1300 
     ctF  300   30  800 

Przyznaję, że nie jest to całkowicie oczywiste.

+3

działa to, jeśli mamy wartości =, jeśli kolumny są tworzone z kolumnami = ..., będzie tylko jedna kolumna "Wszystkie". – Winand

18

Możesz uzyskać sumę wartości za pomocą groupby() w kolumnie State.

Pozwala zrobić kilka przykładowych danych pierwszy:

import pandas as pd 
import StringIO 

incsv = StringIO.StringIO("""Date,State,City,SalesToday,SalesMTD,SalesYTD 
20130320,stA,ctA,20,400,1000 
20130320,stA,ctB,30,500,1100 
20130320,stB,ctC,10,500,900 
20130320,stB,ctD,40,200,1300 
20130320,stC,ctF,30,300,800""") 

df = pd.read_csv(incsv, index_col=['Date'], parse_dates=True) 

Następnie zastosować funkcję GroupBy i dodać kolumnę Miasto:

dfsum = df.groupby('State', as_index=False).sum() 
dfsum['City'] = 'All' 

print dfsum 

    State SalesToday SalesMTD SalesYTD City 
0 stA   50  900  2100 All 
1 stB   50  700  2200 All 
2 stC   30  300  800 All 

Możemy dołączania oryginalnych danych do podsumował df za pomocą dołączania:

dfsum.append(df).set_index(['State','City']).sort_index() 

print dfsum 

      SalesMTD SalesToday SalesYTD 
State City         
stA All  900   50  2100 
     ctA  400   20  1000 
     ctB  500   30  1100 
stB All  700   50  2200 
     ctC  500   10  900 
     ctD  200   40  1300 
stC All  300   30  800 
     ctF  300   30  800 

Dodałem wartości set_index i sort_index, aby wyglądały bardziej jak przykładowe wyniki, s nie jest bezwzględnie konieczne, aby uzyskać wyniki.

0

Co z tym jednym?

table = pd.pivot_table(data, index=['State'],columns = ['City'],values=['SalesToday', 'SalesMTD','SalesYTD'],\ 
         aggfunc=np.sum, margins=True) 

enter image description here

1

Myślę, że ta suma częściowa przykład kodu jest to, co chcesz (podobny do programu Excel podsumę)

Zakładam, że chcesz grupę kolumnach A, B, C, D, niż liczyć wartość kolumny E

main_df.groupby(['A', 'B', 'C']).apply(lambda sub_df: sub_df\ 
     .pivot_table(index=['D'], values=['E'], aggfunc='count', margins=True) 

Wydajność:

A B C D E 
     a 1 
a a a b 2 
     c 2 
    all 5 
     a 3 
b b a b 2 
     c 2 
    all 7 
     a 3 
b b b b 6 
     c 2 
     d 3 
    all 14