Расчеты процентов сводной таблицы Pandas

учитывая следующий фрейм данных и сводную таблицу:

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 столбца в эту сводную таблицу; один показывает процент всех значений, а другой для процентов в столбце A, как это:

           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%

Дополнительно:

Я хотел бы нижнюю сводную строку, которая имеет сумму столбца C (это нормально, если она также имеет 100% для следующих 2 столбцов, но для них ничего не нужно).

1 ответов


вы можете использовать:

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