Pandas GroupBy каждый месяц подсчитывает промежуточные итоги на основе строки в столбце - PullRequest
0 голосов
/ 06 июня 2018

Я рассчитываю получить процентное соотношение совершенных сделок к общему количеству сделок за месяц.Раньше мои данные обрабатывались только за один месяц и решались следующим образом:

total_trades = df['state'].count()
RFQ_Hit_Rate = done_trades / total_trades
RFQ_Hit_Rate = round(RFQ_Hit_Rate, 6)

Сейчас есть данные за 12 месяцев, поэтому мне нужно обновить код.Новые данные

dfHit_Rate_All = df[['Year_Month','state']].copy()
dfHit_Rate_All = dfHit_Rate_All.groupby(['Year_Month','state']).size().reset_index(name='count')

  Year_Month    state           Counts  
     2017-11    Customer Reject  1  
     2017-11    Customer Timeout 2  
     2017-11    Dealer Reject    3  
     2017-12    Dealer Timeout   4  
     2017-12    Done             5  
     2017-12    Done             6  
     2018-01    Tied Covered     7  
     2018-01    Tied Done        8  
     2018-01    Tied Traded Away 9  
     2018-02    Traded Away      10 
     2018-02    Done             11 
     2018-02    Customer Reject  12 

Для каждого месяца найдите общее количество сделок, общее количество совершенных сделок и рассчитайте коэффициент.Заметьте, что любая строка с 'Done' в ней является сделкой завершенной, т.е. [df ['state']. Str.contains ('Done'):

Year_Month  Total_state_count   Total_state_count_Done  Done_To_Total_Ratio
2017-11               6                        0                0%
2017-12               15                       11               73%
2018-01               24                       8                33%
2018-02               33                       11               33%

1 Ответ

0 голосов
/ 06 июня 2018

Я думаю, что нужно агрегировать по agg с кортежами - новое имя столбца с функциями агрегирования:

agg = [('Total_state_count_Done',lambda x: x.str.contains('Done').sum()), 
       ('Total_state_count', 'size')]
df = df.groupby('Year_Month')['state'].agg(agg)

И для нового деления столбца и кратного 100:

df['Done_To_Total_Ratio'] = df['Total_state_count_Done'].div(df['Total_state_count']).mul(100)

print (df)
            Total_state_count_Done  Total_state_count  Done_To_Total_Ratio
Year_Month                                                                
2017-11                          0                  3             0.000000
2017-12                          2                  3            66.666667
2018-01                          1                  3            33.333333
2018-02                          1                  3            33.333333

При необходимости преобразуйте последний столбец в целые и добавьте проценты:

df['Done_To_Total_Ratio'] = (df['Total_state_count_Done']
                                  .div(df['Total_state_count'])
                                  .mul(100)
                                  .astype(int)
                                  .astype(str)
                                  .add('%'))

print (df)
            Total_state_count_Done  Total_state_count Done_To_Total_Ratio
Year_Month                                                               
2017-11                          0                  3                  0%
2017-12                          2                  3                 66%
2018-01                          1                  3                 33%
2018-02                          1                  3                 33%
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...