unstack tabla pivote groupby python pandas pivot-table

python - tabla - Pandas Pivot tables fila subtotales



tabla pivote pandas (4)

Creo que este código de ejemplo subtotal es lo que quieres (similar al subtotal de Excel)

Supongo que quiere agrupar por columnas A, B, C, D, que contar el valor de columna de E

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

salida:

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

Estoy usando Pandas 0.10.1

Considerando este 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

¿Cómo puedo agrupar subtotales por estado?

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

Intenté con una tabla dinámica pero solo puedo tener subtotales en columnas

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

Puedo lograr esto en Excel, con una tabla dinámica.


Puede obtener los valores resumidos utilizando groupby () en la columna Estado.

Primero hagamos algunos datos de muestra:

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)

A continuación, aplique la función groupby y agregue una columna City:

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

Podemos agregar los datos originales al df sumado mediante el uso de append:

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

Agregué set_index y sort_index para que se parezca más a su resultado de ejemplo, no es estrictamente necesario para obtener los resultados.


Que tal este ?

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


Si coloca State and City no en las dos filas, obtendrá márgenes separados. Cambie de forma y obtenga la mesa que busca:

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

Admito que esto no es totalmente obvio.