2016-07-03 9 views
18

Mam dataframe, który wygląda tak:Grupowa ramka danych i uzyskać sumę I liczbę?

   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 

Jak mogę zsumować Amount i policzyć Organisation Name, aby otrzymać nowy dataframe który wygląda tak?

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

wiem jak podsumować lub Count:

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

, ale nie jak to zrobić zarówno!

Odpowiedz

41

spróbuj tego:

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 

lub jeśli nie chcesz, aby zresetować indeks:

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

lub

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

To działa! Dziękuję Ci! – Richard

+1

@MaxU jest sposobem na zastosowanie sumy i policzenie do różnych, ale wielu coulmnów. Kiedy próbuję nadać kolumnom taką listę: agg ({['hotel_name', 'hotel_country']: 'count', ['cost', 'revenue', 'clicks']: 'sum'}) daje "TypeError: unhashable type: 'list" "error – CanCeylan

+0

@CanCeylan nie wiem, czy można to zrobić w klauzuli groupby, ale możesz to osiągnąć, dodając wcześniej fikcyjną kolumnę zliczania do ramki danych, a następnie wykonaj sumę groupby:' df ['count'] = 1' –

0

Jeśli masz dużo kolumn i tylko jedna jest inna można zrobić:

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 

Uwagi można następnie zmienić nazwę kolumny Nazwa organizacji, jak chcesz.