Как можно суммировать значения Pandas Dataframe в многоиндексной сводной области, независимо от того, существуют они или нет? - PullRequest
0 голосов
/ 22 января 2019

У меня есть сводная таблица, созданная со следующим кодом:

AdminPivot = pd.pivot_table(admindata, index=['Function Name', 'Manager'], values=['Paid Hours']) 

enter image description here

+---------------+-----------+------------+
| Function Name |  Manager  | Paid Hours |
+---------------+-----------+------------+
| Function 1    | Manager 1 |       0.21 |
| Function 2    | Manager 2 |       0.73 |
| Function 3    | Manager 1 |      2.335 |
|               | Manager 3 |       0.51 |
|               | Manager 4 |        1.4 |
|               | Manager 5 |      0.796 |
|               | Manager 6 |       0.48 |
|               | Manager 7 |         12 |
| Function 4    | Manager2  |       0.15 |
| Function 6    | Manager 1 |       0.87 |
|               | Manager 3 |       0.31 |
+---------------+-----------+------------+

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

Sum of Function 1 Total Paid Hours if managers is (Manager 5, 6, 7)
Sum of Function 2 Total Paid Hours if managers in (Manager 2, 6, 7)
Sum of Function 3 Total Paid Hours if managers in (Manager 1, 3, 6, 7)

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

AdminPivot.loc[('Function 1', 'Manager 1'), 'Paid Hours']

Впоследствии можно повторить тезначения и по существу жесткий код менеджеров с заявлениями if.Тем не менее, должен быть более элегантный подход.

В частности, как можно выполнить итерации по этим данным:

  • Возможно, для данной функции не было назначено ни одного часа (Null)
  • Возможно, для менеджера в данном потоке не назначено часов (Null)
  • Менеджеры могут измениться

Я пытаюсь найтихороший способ перебрать это без воссоздания операторов loc для каждой функции и каждого менеджера и добавления их - с помощью оператора if для того, существует ли он.Любая помощь приветствуется!

1 Ответ

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

Получите список всех ваших необходимых комбинаций, что позволит вам создать все идентификаторы:

l = [('Function 1', ['Manager 5', 'Manager 6', 'Manager 7']),
     ('Function 2', ['Manager 2', 'Manager 6', 'Manager 7']),
     ('Function 3', ['Manager 1', 'Manager 3', 'Manager 6', 'Manager 7'])]

ids = [(x, z) for x,y in l for z in y]

Тогда вы сможете .reindex + .sum

df.reindex(ids).sum(level=0)

               Paid Hours
Function Name            
Function 1          0.000
Function 2          0.730
Function 3         15.325

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

                         Paid Hours
Function Name Manager              
Function 1    Manager 5         NaN
              Manager 6         NaN
              Manager 7         NaN
Function 2    Manager 2       0.730
              Manager 6         NaN
              Manager 7         NaN
Function 3    Manager 1       2.335
              Manager 3       0.510
              Manager 6       0.480
              Manager 7      12.000
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...