Используйте unstack
для изменения формы, поэтому возможно деление на строки, последнее изменение назад на stack
.
Последний для правильного заказа используйте swaplevel
, sort_index
и последний reindex
.
df1 = df.unstack(0)
df1.loc['% Completed', :] = df1.loc['Complete', :] / df1.loc['Total', :]
vals = ['Complete','Total','% Completed']
df1 = df1.stack().swaplevel(0,1).sort_index().reindex(vals, level=1)
print (df1)
June July August September
Tasks Des
A Complete 33.000000 10.000000 0.000000 0.000000
Total 181.000000 85.000000 69.000000 15.000000
% Completed 0.182320 0.117647 0.000000 0.000000
B Complete 5.000000 9.000000 0.000000 1.000000
Total 13.000000 12.000000 5.000000 1.000000
% Completed 0.384615 0.750000 0.000000 1.000000
C Complete 66.000000 54.000000 27.000000 12.000000
Total 137.000000 89.000000 78.000000 22.000000
% Completed 0.481752 0.606742 0.346154 0.545455
D Complete 451.000000 127.000000 87.000000 28.000000
Total 629.000000 203.000000 174.000000 51.000000
% Completed 0.717011 0.625616 0.500000 0.549020
E Complete 46.000000 27.000000 29.000000 2.000000
Total 135.000000 100.000000 86.000000 24.000000
% Completed 0.340741 0.270000 0.337209 0.083333
Другое решение с выбором по DataFrame.xs
, делением и созданием уровня MultiIndex
по assign
и set_index
:
df1 = (df.xs('Complete', level=1)
.div(df.xs('Total', level=1))
.assign(Des='% Completed')
.set_index('Des', append=True)
)
vals = ['Complete','Total','% Completed']
df1 = df.append(df1).sort_index().reindex(vals, level=1)