#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