2017-12-20 39 views
2

ピボットテーブルに小計行を追加しようとしています(pandas pd.pivot_tableを使用)。これはコードtable = pd.pivot_table(df, values= ['Quantity', 'Money', 'Cost'], index=['house','date', 'currency', 'family name'], columns=[], fill_value=0, aggfunc=np.sum)です。ピボットテーブル(pandas)の小計行が使用されている場合、インデックスセクション(異なる列)を保持

enter image description here

は次に、Iを基準としてhouseを使用して小計行を取得しようとした:これは、(Excelにエクスポート)は、対応する出力です。私はこのリンクPivot table subtotals in Pandasに記載されている手順に従ったので、tablesum = table.groupby(level='house').sum()を使ってグループを作成しました。 tabletablesumのデータフレームを連結しようとするまで、すべてがうまくいっていたようでした。これは私が(家族Aのために)得たものである:

enter image description here

基本的に、私はちょうど1列にtable'sインデックス(家、日付、通貨、家族の名前)に記載された四つのカテゴリーを得ました(カンマで区切ります)。だから、私が家で小計を取っても、私はピボットテーブルの分離を失った。だから、私の質問です:どのように私はそれを維持することができます(pivot_tableのインデックスを別の列に維持する)?

何か助けていただければ幸いです。

よろしく、

PD:私はまた、このリンクSub Total in pandas pivot Tableをチェックするが、これは私に、文字列や数値に関連するエラーの別のタイプを与えました。

+0

はあなたには、いくつかを提供することができ:セカンドレベルdateも、他の文字列との連結を得るために、文字列に変換する必要があります何が起きているのかをテストするためのデータ? –

+0

回答を完全に編集しています。確認してください。 – jezrael

答えて

1

カスタムMultiIndex4とのレベルを作成し、割り当てることができます。

お知らせ:

TypeError: Cannot compare type 'Timestamp' with type 'str'

df = pd.DataFrame({'house':list('aaaaabbbbb'), 
        'date':['2015-01-01'] * 3 + ['2015-01-02'] * 2 + 
          ['2015-01-01'] * 3 +['2015-01-02'] * 2, 
        'currency':['USD'] * 3 + ['NK'] * 2 + ['USD'] * 3 +['NK'] * 2, 
        'Quantity':[1,3,5,7,1,0,7,2,3,9], 
        'Money':[5,3,6,9,2,4,7,2,3,9], 
        'Cost':[5,3,6,9,2,4,7,2,3,9], 
        'family name':list('aabbccaabb')}) 

print (df) 
    Cost Money Quantity currency  date family name house 
0  5  5   1  USD 2015-01-01   a  a 
1  3  3   3  USD 2015-01-01   a  a 
2  6  6   5  USD 2015-01-01   b  a 
3  9  9   7  NK 2015-01-02   b  a 
4  2  2   1  NK 2015-01-02   c  a 
5  4  4   0  USD 2015-01-01   c  b 
6  7  7   7  USD 2015-01-01   a  b 
7  2  2   2  USD 2015-01-01   a  b 
8  3  3   3  NK 2015-01-02   b  b 
9  9  9   9  NK 2015-01-02   b  b 

#convert only for subtotal - join with empty strings 
df['date'] = df['date'].astype(str) 

table = pd.pivot_table(df, values= ['Quantity', 'Money', 'Cost'], 
         index=['house','date', 'currency', 'family name'], 
         fill_value=0, 
         aggfunc=np.sum) 
print (table) 
             Cost Money Quantity 
house date  currency family name      
a  2015-01-01 USD  a    8  8   4 
          b    6  6   5 
     2015-01-02 NK  b    9  9   7 
          c    2  2   1 
b  2015-01-01 USD  a    9  9   9 
          c    4  4   0 
     2015-01-02 NK  b    12  12  12 

tablesum = table.groupby(level='house').sum() 

tablesum.index = pd.MultiIndex.from_arrays([tablesum.index.get_level_values(0)+ '_sum', 
              len(tablesum.index) * [''], 
              len(tablesum.index) * [''], 
              len(tablesum.index) * ['']]) 

print (tablesum) 
      Cost Money Quantity 
a_sum  25  25  17 
b_sum  25  25  21 

print (tablesum.index) 
MultiIndex(levels=[['a_sum', 'b_sum'], [''], [''], ['']], 
      labels=[[0, 1], [0, 0], [0, 0], [0, 0]]) 


df = pd.concat([table, tablesum]).sort_index(level=0) 
print (df) 
             Cost Money Quantity 
house date  currency family name      
a  2015-01-01 USD  a    8  8   4 
          b    6  6   5 
     2015-01-02 NK  b    9  9   7 
          c    2  2   1 
a_sum         25  25  17 
b  2015-01-01 USD  a    9  9   9 
          c    4  4   0 
     2015-01-02 NK  b    12  12  12 
b_sum         25  25  21 
+0

ありがとう!この点について別の質問をしたいと思います。 ** house ** '{' a ':10、' b ':100'} 'の辞書を作成しました。 マップを使用して、これを新しいデータフレーム(df)にリンクすることは可能ですか?私は試しているが、エラーが表示されます: 'Key error house' – newbie

関連する問題