Pandas Группировка и вычисление отношения двух столбцов - PullRequest
0 голосов
/ 09 февраля 2020

Я пытаюсь использовать 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

1 Ответ

1 голос
/ 09 февраля 2020

Попробуйте (с оригиналом df):

df.groupby("Department")["Status"].value_counts(normalize=True).mul(100)

Выходы:

Department  Status
Finance     Contractor    100.000000
Marketing   Contractor     50.000000
            Employee       50.000000
Sales       Employee       66.666667
            Contractor     33.333333
Name: Status, dtype: float64
...