Solución:
Si coloca Estado y Ciudad no ambos en las filas, obtendrá márgenes separados. Cambie la forma y obtendrá 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.
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)
Luego aplique la función groupby y agregue una columna Ciudad:
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 usando 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 salida de ejemplo, no es estrictamente necesario para obtener los resultados.
Creo que este código de ejemplo de subtotal es lo que desea (similar al subtotal de Excel)
Supongo que desea agrupar por columnas A, B, C, D, que contar el valor de la 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)
producción:
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
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)