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()