Multi-Index DataFrame - добавление строки с использованием других строк - PullRequest
0 голосов
/ 19 января 2019

Посмотрите, сколько задач было создано против того, сколько было выполнено каждый месяц.

Я хочу добавить в многоиндексную таблицу строку, показывающую процент выполнения задач для каждого типа задач.

Поэтому для каждой задачи (A, B, C, D, E) я бы хотел, чтобы в ней были строки «Итого», «Завершено» и «% выполнено» (строка завершена, деленная на сумму)

Изо всех сил пытаюсь понять это, любая помощь приветствуется!

Текущая таблица:

Month June July August September Tasks Des<br> A Total 181.0 85.0 69.0 15.0 Complete 33.0 10.0 0.0 0.0 B Total 13.0 12.0 5.0 1.0 Complete 5.0 9.0 0.0 1.0 C Total 137.0 89.0 78.0 22.0 Complete 66.0 54.0 27.0 12.0 D Total 629.0 203.0 174.0 51.0 Complete 451.0 127.0 87.0 28.0 E Total 135.0 100.0 86.0 24.0 Complete 46.0 27.0 29.0 2.0

1 Ответ

0 голосов
/ 19 января 2019

Используйте 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)
...