Я пытаюсь использовать Pandas и groupby, чтобы вычислить соотношение двух столбцов. В приведенном ниже примере я хочу рассчитать соотношение сотрудников Статус на Отдел (Количество статусов в отделе / Общее количество сотрудников на отдел). Например, в отделе Sales работают 3 сотрудника, а количество сотрудников, имеющих статус Employee , равно 2, что дает соотношение 2/3, 66,67%. Мне удалось взломать мой путь, чтобы получить это, но должен быть более элегантный и простой способ сделать это. Как я могу получить желаемый результат ниже более эффективно?
Исходный фрейм данных:
Department Name Status
0 Sales John Employee
1 Sales Steve Employee
2 Sales Sara Contractor
3 Finance Allen Contractor
4 Marketing Robert Employee
5 Marketing Lacy Contractor
Код:
mydict ={
'Name': ['John', 'Steve', 'Sara', 'Allen', 'Robert', 'Lacy'],
'Department': ['Sales', 'Sales', 'Sales', 'Finance', 'Marketing', 'Marketing'],
'Status': ['Employee', 'Employee', 'Contractor', 'Contractor', 'Employee', 'Contractor']
}
df = pd.DataFrame(mydict)
# Create column with total number of staff Status per Department
df['total_dept'] = df.groupby(['Department'])['Name'].transform('count')
print(df)
print('\n')
# Crate column with Status ratio per department
for k, v, in df.iterrows():
df.loc[k, 'Status_Ratio'] = (df.groupby(['Department', 'Status']).count().xs(v['Status'], level=1)['total_dept'][v['Department']]/v['total_dept']) *100
print(df)
print('\n')
# Final Groupby with Status Ratio. Size NOT needed
print(df.groupby(['Department', 'Status', 'Status_Ratio']).size())
Желаемый выход:
Department Status Status_Ratio
Finance Contractor 100.00
Marketing Contractor 50.00
Employee 50.00
Sales Contractor 33.33
Employee 66.67