Saltar al contenido

Subtotales de fila de las tablas dinámicas de Pandas

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)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *