Вычисление процента с помощью цикла for с помощью группы by

#python #python-3.x #pandas

#python #python-3.x #pandas

Вопрос:

Если у меня есть приведенный ниже код с циклом, который дает мне соотношение потерянных и выигранных типов на основе приведенного ниже, как мне изменить код, если я хочу просмотреть те же данные, но сгруппированные профессором?

 leads = ['Passed','Failed']
max_status = None
max_percent = None
for lead in leads:
    df_overall = df[(df['Status']== lead) amp; (df['size']== '20-34')]
    num_overall = len(df_overall) 
    lead_df = df[(df['size']== '20-34')]
    num_total = len(lead_df)
    percentage_overall = num_overall / num_total
   
    
    if max_status is None: 
        
        
        
        print(lead, percentage_overall)
  

Это дает мне результат, как показано ниже:

 Passed .65
Failed .35
  

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

Ожидаемый результат:

 Mr. Johnson Passed .35
Mr. Johnson Failed .65
Ms. Jones   Passed .90
Ms. Jones   Failed .10
Mr. Boe     Passed .80
Mr. Boe     Passed .20
  

Спасибо

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

1. Вы groupby профессор, а затем применяете свою математику к каждой группе. В онлайновых руководствах есть множество примеров. Где вы застряли? Пожалуйста, опубликуйте свою попытку кодирования.

2. можете ли вы поделиться некоторым содержимым из df. Я думаю, вы можете сделать это с помощью более простого groupby

Ответ №1:

Я считаю, что вам нужно GroupBy.size :

 leads = ['Passed','Failed']

lead_df = df[(df['size']== '20-34')]
#filter by list leads
df_overall = lead_df[lead_df['Status'].isin(lead)]

num_overall1 = df_overall.groupby(['professor','Status']).size()
num_total1 = lead_df.groupby(['professor','Status']).size()

out = num_overall1.div(num_total1).reset_index(name='per')
print (out)