Расчеты процентов сводной таблицы 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