2016-07-03 6 views
18

У меня есть dataframe, который выглядит следующим образом:Группа данных и получить сумму И счет?

   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 

Как суммированию Amount и сосчитать Organisation Name, чтобы получить новый dataframe, который выглядит, как это?

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

Я знаю, как подвести или количество:

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

Но не так, как это сделать, и другое!

ответ

41

попробовать это:

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 

или если вы не хотите сбросить индекс:

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

или

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

Демо:

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

Это работает! Спасибо! – Richard

+1

@MaxU есть способ применить сумму и счет к различным, но нескольким coulmns. Когда я пытаюсь предоставить столбцы в виде списка: agg ({['hotel_name', 'hotel_country']: 'count', ['cost', 'income', 'clicks']: 'sum'}), он дает «TypeError: unhashable type:« list »» error – CanCeylan

+0

@CanCeylan не знает, возможно ли это сделать в предложении groupby, но вы можете его достичь, добавив фиктивный графа count в кадр данных заранее, а затем выполните команду group by sum: 'df ['count'] = 1' –

0

Если у вас есть много столбцов и только один отличается вы могли бы сделать:

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 

Примечания вы можете переименовать столбец названия организации, как вы хотите.