Добавление значения по умолчанию при группировании элементов в Pandas

#python #python-3.x #pandas #dataframe #pandas-groupby

#python #python-3.x #pandas #фрейм данных #pandas-groupby

Вопрос:

Я работаю с фреймом данных Pandas, и мои данные содержат EmployeeNo, Payable и Amount в виде столбцов.

       EmpNo     Payable    Amount

      01        Salary     20000
      01        Salary     2000
      01        Bonus      150

      02        Salary     15000

      03        Salary     10000
      03        Bonus      50
      03        Bonus      150

      04        Salary     12000
      04        Salary     3000
  

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

 df_2 = df.groupby([ 'EmpNo', 'Payable'])['Amount'].sum()
  

Но он не показывает бонус для каждого сотрудника.

Я хочу, чтобы мой вывод отображал 0 в качестве значения по умолчанию, если бонус не назначен ни одному сотруднику в следующем формате:

       EmpNo     Payable    Amount
      
      01        Salary     22000
                Bonus      150

      02        Salary     15000
                Bonus      0

      03        Salary     10000
                Bonus      200

      04        Salary     15000
                Bonus      0

  

Ответ №1:

Добавить Series.unstack с помощью DataFrame.stack :

 df_2 = df.groupby([ 'EmpNo', 'Payable'])['Amount'].sum().unstack(fill_value=0).stack()
print (df_2)
EmpNo  Payable
1      Bonus        150
       Salary     22000
2      Bonus          0
       Salary     15000
3      Bonus        200
       Salary     10000
4      Bonus          0
       Salary     15000
dtype: int64
  

При необходимости преобразовать в DataFrame add Series.reset_index :

 df_2 = (df.groupby([ 'EmpNo', 'Payable'])['Amount']
          .sum()
          .unstack(fill_value=0)
          .stack()
          .reset_index(name='Amount'))
print (df_2)
   EmpNo Payable  Amount
0      1   Bonus     150
1      1  Salary   22000
2      2   Bonus       0
3      2  Salary   15000
4      3   Bonus     200
5      3  Salary   10000
6      4   Bonus       0
7      4  Salary   15000
  

Комментарии:

1. df.pivot_table(‘Amount’, ‘EmpNo’, ‘Payable’, ‘sum’, 0).stack() будет другим путем к первому варианту.

2. @Jamie — Yop, в другом ответе.

Ответ №2:

Вы также можете использовать df.pivot_table :

 In [393]: df.pivot_table(index='EmpNo', columns='Payable', aggfunc='sum', fill_value=0).stack().reset_index()
Out[393]: 
   EmpNo Payable  Amount
0      1   Bonus     150
1      1  Salary   22000
2      2   Bonus       0
3      2  Salary   15000
4      3   Bonus     200
5      3  Salary   10000
6      4   Bonus       0
7      4  Salary   15000