2 votes

Pandas Groupby : Agrégations sur la même colonne mais totaux basés sur deux critères / cadres de données différents.

Mon Dataframe :

display_name    security_type1  currency_str     state
         A            GOVT           USD         Done
         B            CORP           NZD         Passed
         B            CORP           USD         Done
         C            CORP           EUR         Done
         C            CORP           EUR         Traded Away
         C            CORP           GBP         Done
         C            CORP           GBP         Done
         C            CORP           USD         Done

Mon résultat dérivé est de :

a. Groupement par display_name , security_type1 y currency_str

b. Comptez ensuite le nombre de lignes où column state contient Done et mettre à jour la colonne Done_RFQ

c. Affichez le nombre total de lignes pour chaque display_name , security_type1 y currency_str combinaison et colonne de mise à jour Total_RFQ

d. et enfin afficher le pourcentage de Done par rapport au nombre total, c'est-à-dire Done_Pct = Done_RFQ / Total_RFQ

display_name    security_type1  currency_str   Done_RFQ Total_RFQ Done_Pct
A               GOVT             USD           1           1      100%
B               CORP             USD           1           2      50%
C               CORP             EUR           1           5      20%
C               CORP             GBP           2           5      40%
C               CORP             USD           1           5      20%

Mon code qui fonctionne à l'exception de la Total_RFQ d'où Done_Pct également

d = [('Done_RFQ', 'size')]
df_Done_Client = df[
                    df['state'].str.contains('Done')
                ][['display_name','security_type1','currency_str','state']].copy()

df_Done_Client =    
    df_Done_Client.groupby(['display_name','security_type1','currency_str'])['state'].agg(d).reset_index()
    # Sum of all Done RFQ's per display_name
    Sum_of_Done_For_Month = df_Done_Client.groupby('display_name')['Done_RFQ'].transform('sum')
    df_Done_Client['Total_Done_RFQ'] = Sum_of_Done_For_Month
    df_Done_Client['Done_Pct'] = df_Done_Client['Done_RFQ_For_Month'].div(Sum_of_Done_For_Month).round(5)
    display(df_Done_Client)

Je ne sais pas comment calculer ce total, car il doit provenir d'un autre cadre de données, c'est-à-dire des mêmes champs, mais sans le critère "Done".

df_All_Client = df[['display_name','security_type1','currency_str','state']].copy()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X