Pandas Сводные промежуточные итоги строк
Я использую Pandas 0.10.1
Учитывая этот 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
Как я могу группировать промежуточные итоги по состоянию?
State City SalesToday SalesMTD SalesYTD
stA ALL 50 900 2100
stA ctA 20 400 1000
stA ctB 30 500 1100
Я пробовал с помощью сводной таблицы, но я могу только иметь промежуточные итоги в столбцах
table = pivot_table(df, values=['SalesToday', 'SalesMTD','SalesYTD'],\
rows=['State','City'], aggfunc=np.sum, margins=True)
Я могу добиться этого на excel с помощью сводной таблицы.
Ответы
Ответ 1
Если вы поместите State и City не в строки, вы получите отдельные поля. Измените форму, и вы получите таблицу, после которой:
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
Я признаю, что это не совсем очевидно.
Ответ 2
Вы можете получить обобщенные значения, используя groupby() в столбце State.
Сначала сделаем некоторые данные выборки:
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)
Затем примените функцию groupby и добавьте столбец Город:
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
Мы можем добавить исходные данные к суммированному df, используя 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
Я добавил set_index и sort_index, чтобы он выглядел больше похожим на ваш пример вывода, и не обязательно нужно было получать результаты.
Ответ 3
Как насчет этого?
table = pd.pivot_table(data, index=['State'],columns = ['City'],values=['SalesToday', 'SalesMTD','SalesYTD'],\
aggfunc=np.sum, margins=True)
![введите описание изображения здесь]()
Ответ 4
Я думаю, что этот примерный примерный код - это то, что вы хотите (похоже на excel subtotal)
Я предполагаю, что вы хотите группировать по столбцам A, B, C, D, чем значение столбца столбца E
main_df.groupby(['A', 'B', 'C']).apply(lambda sub_df: sub_df\
.pivot_table(index=['D'], values=['E'], aggfunc='count', margins=True)
выход:
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