98 votes

Grouper le cadre de données et obtenir la somme ET le nombre?

J'ai un dataframe qui ressemble à ceci:

               Company Name              Organisation Name  Amount
10118  Vifor Pharma UK Ltd  Welsh Assoc for Gastro & Endo 2700.00
10119  Vifor Pharma UK Ltd    Welsh IBD Specialist Group,  169.00
10120  Vifor Pharma UK Ltd             West Midlands AHSN 1200.00
10121  Vifor Pharma UK Ltd           Whittington Hospital   63.00
10122  Vifor Pharma UK Ltd                 Ysbyty Gwynedd   75.93
 

Comment additionner les Amount et compter les Organisation Name pour obtenir une nouvelle trame de données qui ressemble à ceci?

               Company Name             Organisation Count   Amount
10118  Vifor Pharma UK Ltd                              5 11000.00
 

Je sais comment additionner ou compter:

 df.groupby('Company Name').sum()
df.groupby('Company Name').count()
 

Mais pas comment faire les deux!

174voto

MaxU Points 5284

essaye ça:

 In [110]: (df.groupby('Company Name')
   .....:    .agg({'Organisation Name':'count', 'Amount': 'sum'})
   .....:    .reset_index()
   .....:    .rename(columns={'Organisation Name':'Organisation Count'})
   .....: )
Out[110]:
          Company Name   Amount  Organisation Count
0  Vifor Pharma UK Ltd  4207.93                   5
 

ou si vous ne voulez pas réinitialiser l'index:

 df.groupby('Company Name')['Amount'].agg(['sum','count'])
 

ou

 df.groupby('Company Name').agg({'Amount': ['sum','count']})
 

Démo:

 In [98]: df.groupby('Company Name')['Amount'].agg(['sum','count'])
Out[98]:
                         sum  count
Company Name
Vifor Pharma UK Ltd  4207.93      5

In [99]: df.groupby('Company Name').agg({'Amount': ['sum','count']})
Out[99]:
                      Amount
                         sum count
Company Name
Vifor Pharma UK Ltd  4207.93     5
 

4voto

JSharm Points 175

Si vous avez beaucoup de colonnes et qu'une seule est différente, vous pouvez le faire:

 In[1]: grouper = df.groupby('Company Name')
In[2]: res = grouper.count()
In[3]: res['Amount'] = grouper.sum()['Amount']
In[4]: res
Out[4]:
                      Organisation Name   Amount
Company Name                                   
Vifor Pharma UK Ltd                  5  4207.93
 

Notez que vous pouvez ensuite renommer la colonne Nom de l'organisation à votre guise.

1voto

cvsnow Points 1
df.groupby('Company Name').agg({'Organisation name':'count','Amount':'sum'})\
    .apply(lambda x: x.sort_values(['count','sum'], ascending=False))

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