Вы можете использовать subtotals = df.groupby(level=['Type']).mean()
для вычисления промежуточных итогов.Затем
label_order = ['{}{}'.format(pre,label) for label in subtotals.index
for pre in ['', 'Total_']] + ['All']
создает желаемый порядок меток.Наконец, df = df.loc[label_order]
переупорядочивает строки:
import pandas as pd
import numpy as np
nan = np.nan
df = pd.DataFrame({'All': [100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, nan], 'Exact': [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 65.0], 'Near': [0.0, 100.0, 100.0, 100.0, 100.0, 100.0, 0.0, 100.0, 100.0, 100.0, 30.0], 'No': [100.0, 0.0, 0.0, 0.0, 0.0, 0.0, 100.0, 0.0, 0.0, 0.0, 100.0], 'Size': [10.0, 100.0, 500.0, 1000.0, 5000.0, 10.0, 100.0, 500.0, 1000.0, 5000.0, 5.0], 'Type': ['X', 'X', 'X', 'X', 'X', 'Y', 'Y', 'Y', 'Y', 'Y', 'All']})
df = df.set_index(['Type','Size'])
df.columns.name = 'Found'
subtotals = df.groupby(level=['Type']).mean()
subtotals = subtotals.loc[subtotals.index != 'All']
label_order = ['{}{}'.format(pre,label) for label in subtotals.index for pre in ['', 'Total_']] + ['All']
subtotals.index = ['Total_{}'.format(label) for label in subtotals.index]
subtotals['Size'] = ''
df = pd.concat([df.reset_index('Size'), subtotals], axis=0, sort=False)
df = df.loc[label_order]
df = df.set_index('Size', append=True)
приводит к
All Exact Near No
Size
X 10.0 100.0 0.0 0.0 100.0
100.0 100.0 0.0 100.0 0.0
500.0 100.0 0.0 100.0 0.0
1000.0 100.0 0.0 100.0 0.0
5000.0 100.0 0.0 100.0 0.0
Total_X 100.0 0.0 80.0 20.0
Y 10.0 100.0 0.0 100.0 0.0
100.0 100.0 0.0 0.0 100.0
500.0 100.0 0.0 100.0 0.0
1000.0 100.0 0.0 100.0 0.0
5000.0 100.0 0.0 100.0 0.0
Total_Y 100.0 0.0 80.0 20.0
All 5.0 NaN 65.0 30.0 100.0