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.
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.