2016-05-10 6 views
4

パンダピボットテーブルパーセントの計算

import pandas as pd 
df=pd.DataFrame({'A':['x','y','z','x','y','z'], 
       'B':['one','one','one','two','two','two'], 
       'C':[2,18,2,8,2,18]}) 
df 

    A B  C 
0 x one  2 
1 y one  18 
2 z one  2 
3 x two  8 
4 y two  2 
5 z two  18 

table = pd.pivot_table(df, index=['A', 'B'],aggfunc=np.sum) 

      C 
A B 
x one  2 
    two  8 
y one  18 
    two  2 
z one  2 
    two  18 

私は、このピボット・テーブルに2列を追加したいと思います。

  C % of Total % of B 
A B 
x one 2 4%   10% 
    two 18 36%   90% 
y one 2 4%   20% 
    two 8 16%   80% 
z one 2 4%   10% 
    two 18 36%   90% 

エクストラクレジット:このようなA列内のパーセントのすべての値のパーセントと他を示す1 Iが列Cの合計を持っている一番下のサマリー行を希望

は、(あれば、それは大丈夫ですそれは次の2つの列についても100%がありますが、それらには何も必要ありません)。

を使用でき

答えて

8

table['% of Total'] = (table.C/table.C.sum() * 100).astype(str) + '%' 
table['% of B'] = (table.C/table.groupby(level=0).C.transform(sum) * 100).astype(str) + '%' 
print table 
     C % of Total % of B 
A B       
x one 2  4.0% 20.0% 
    two 8  16.0% 80.0% 
y one 18  36.0% 90.0% 
    two 2  4.0% 10.0% 
z one 2  4.0% 10.0% 
    two 18  36.0% 90.0% 

しかし、実際のデータと私はintにキャストが良く、使用roundで、推奨されないと思います。

エクストラクレジット:

table['% of Total'] = (table.C/table.C.sum() * 100) 
table['% of B'] = (table.C/table.groupby(level=0).C.transform(sum) * 100) 
table.loc['total', :] = table.sum().values 
print table 
       C % of Total % of B 
A  B        
x  one 2.0   4.0 20.0 
     two 8.0  16.0 80.0 
y  one 18.0  36.0 90.0 
     two 2.0   4.0 10.0 
z  one 2.0   4.0 10.0 
     two 18.0  36.0 90.0 
total  50.0  100.0 300.0 
+0

私はあなたが私のパンダ守護天使だと思います。 –

+0

あなたのすべてを祝福してください! –

+0

ありがとう、幸運;) – jezrael