私はPandas 0.10.1を使用しています
このデータフレームを考慮する:
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でこれを実現できます。
行に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
これは完全に明らかではありません。
State列でgroupby()を使用して、要約値を取得できます。
最初にいくつかのサンプルデータを作成します。
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関数を適用して、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
Appendを使用して、合計されたdfに元のデータを追加できます。
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を追加して、出力の例のように見せるようにしました。結果を得るために厳密に必要なわけではありません。
私はこの小計のサンプルコードがあなたが望むものだと思います(Excelの小計に似ています)
Eの列値をカウントするよりも、列A、B、C、Dでグループ化することを想定しています
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