2017-12-05 1 views
0

私はグループのオン大陸に必要なインデックスを持つ単純なデータフレーム持っている:私はしているよすべての大陸の行を作成し、値としてその小計を組み込んだデータフレームを作成しているPandas Pivot Table-aggfuncを使用して複数インデックスの小計を取得しますか?

country continent value1 value2 value3 
uk  eu    1  9  2 
us  na    8  39  0 
spain  eu    3  9  0 
mexico na    2  7  8 
japan  asia    9  9  2 
china  asia    2  8  6 

をし、最後にGrand totalを追加し、各列の合計を組み込みます。

Row Labels Sum of value1 Sum of value2 Sum of value3 
asia      11    17    8 
china      2    8    6 
japan      9    9    2 
eu      4    18    2 
spain      3    9    0 
uk      1    9    2 
na      10    46    8 
mexico     2    7    8 
us      8    39    0 
Grand Total    25    81    18 

これは私のコードであり、何らかの理由で私はaggfuncで総計を得ることができますが、小計ではありません。

pd.pivot_table(mergedcpt, index=['continent','spread_Bucket'],aggfunc=np.sum, margins=True) 


    eu  uk  1 9 2 
      us  8 39 0 
    na  spain  3 9 0 
     mexico 2 7 8 
    asia japan  9 9 2 
     china  2 8 6 
    all    25 81 18 

何が間違っていますか?助けてくれてありがとう - あなたが集めることができる行を組み込んだ以前のパンダのバージョンを知っていますが、私は新しいバージョンでこれを行う方法がわかりません。ヘルプをよろしくお願いいたします。

+0

「continent」とグループ化して列を合計するのはなぜですか。その後、その国の別のグループに追加して列を合計します。 –

+0

「Total」という名前の代わりに、「EU total」のような名前を付ける必要があります。さらに、小計が最下部にくるようにフォーマットするのは難しいでしょう。 –

+0

また、私はどのようにそのグループをやるのだろうか?私は大陸に渡って集計して集計しますが、手動で各大陸に手作業で割り当てる必要がありますか? –

答えて

1

あなたがしようとしているもののためのクイックワンライナーはありません。大陸をグループ化し、元のデータフレームを追加し、値をソートして必要な順序を取得することによって、新しいデータフレームを作成できます。

import pandas as pd 

df = pd.DataFrame(
    {'continent': ['eu', 'na', 'eu', 'na', 'asia', 'asia'], 
    'country': ['uk', 'us', 'spain', 'mexico', 'japan', 'china'], 
    'value1': [1, 8, 3, 2, 9, 2], 
    'value2': [9, 39, 9, 7, 9, 8], 
    'value3': [2, 0, 0, 8, 2, 6]}) 

g = df.groupby(['continent','continent']).sum() 
g.index.set_names('Row Label', level=-1, inplace=True) 
gt = pd.DataFrame([g.sum()], columns=g.columns, 
    index=pd.MultiIndex.from_tuples([('~','Grand Total')])) 
df2 = g.append(gt).reset_index() 
out = (df2.append(df.rename(columns={'country': 'Row Label'}) 
        .sort_values(['continent', 'Row Label'])) 
      .sort_values('continent') 
      .drop('continent', axis=1) 
      .rename(columns={'value1': 'Sum of value1', 
          'value2': 'Sum of value2', 
          'value3': 'Sum of value3'}) 
      .reset_index(drop=True)) 
out 
# returns: 
    Row Label Sum of value1 Sum of value2 Sum of value3 
0   asia    11    17    8 
1  china    2    8    6 
2  japan    9    9    2 
3   eu    4    18    2 
4  spain    3    9    0 
5   uk    1    9    2 
6   na    10    46    8 
7  mexico    2    7    8 
8   us    8    39    0 
9 Grand Total    25    81    18 
+0

これは私が必要としていたものです - 助けてくれてありがとうございます –

+0

答えとしても問題を記入してください。 – James

関連する問題