2016-07-03 33 views
18

Ho un dataframe che assomiglia a questo:Dataframe di gruppo e ottieni somma E conteggio?

   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 

Come faccio a sommare il Amount e contare il Organisation Name, per ottenere un nuovo dataframe che assomiglia a questo?

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

so come riassumere o conteggio:

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

ma non come fare entrambe le cose!

risposta

41

provare questo:

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 

o se non si desidera azzerare index:

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

o

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

Demo:

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 
+0

Questo funziona! Grazie! – Richard

+1

@MaxU c'è un modo per applicare somme e contare a diversi ma multipli couli. Quando provo a dare le colonne come una lista come questa: agg ({['hotel_name', 'hotel_country']: 'count', ['cost' ',' revenue ',' clicks ']:' sum '}) dà "TypeError: tipo non cancellabile: 'lista'" errore – CanCeylan

+0

@CanCeylan non so se è possibile farlo in una clausola groupby ma puoi ottenerlo aggiungendo prima una colonna conteggio fittizia al dataframe e poi fai una somma di gruppo: 'df ['count'] = 1' –

0

Se hai un sacco di colonne e solo uno è diverso si potrebbe fare:

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 

Nota è possibile rinominare la colonna Nome organizzazione come si desidera.