데이터 프레임을 그룹화하고 합계 및 개수를 얻습니까?


82

다음과 같은 데이터 프레임이 있습니다.

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

그러나 둘 다 수행하는 방법은 아닙니다!

답변:


147

이 시도:

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

2
@MaxU는 서로 다른 여러 열에 합계와 개수를 적용하는 방법이 있습니다. 다음과 같은 목록으로 열을 제공하려고하면 : agg ({[ 'hotel_name', 'hotel_country'] : 'count', [ 'cost', 'revenue', 'clicks'] : 'sum'}) "TypeError : unhashable type : 'list'"오류
CanCeylan

@CanCeylan 그나마 알고있는 경우는 가능하면 GROUPBY 절에 그것을 할 수 있습니다하지만 당신은 사전에 다음 GROUPBY 합을 수행 dataframe에 더미 카운트 열을 추가하여 얻을 수 있습니다df['count'] = 1
칼 엔카

1
마지막으로이 작업을 수행하는 방법을 검색하는 데 2 ​​시간이 걸렸습니다. 세 번째 옵션 인 df.groupby ( 'Company Name'). agg ({ 'Amount': [ 'sum', 'count']}) 만 저에게 효과적이었습니다. .
charo 19

안녕하세요 그 훌륭한 솔루션에 감사드립니다. 내 특별한 경우에는 두 개의 다른 열에서 솔루션을 사용하여 합계를 얻고 행 수를 계산합니다. 불행히도 두 번의 행 수를 얻습니다 (두 열을 모두 계산하기 때문에). 내 테이블이 깨끗하게 보이도록 .counts 중 하나를 제거하는 방법이 있습니까? df.groupby(df['L2 Name'])[["Amount arrear","VSU"]].agg(['sum','count'])
MLAlex

안녕하세요 귀하의 훌륭한 답변에 감사드립니다. 생성 된 새 열을 해석하는 방법과보다 전통적인 방식으로 평면화하는 방법을 알고 있습니까?
Solal

20

집계 중에 열 이름을 바꾸는 방법이 궁금한 경우를 대비하여 다음 방법을 사용하십시오.

pandas> = 0.25 : 명명 된 집계

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

또는,

df.groupby('Company Name').agg(MySum=('Amount', 'sum'), MyCount=('Amount', 'count'))

                       MySum  MyCount
Company Name                       
Vifor Pharma UK Ltd  4207.93        5

이것은 예외적 인 답변이어야합니다. 이전 질문 / 답변을 새롭고 더 나은 작업 방식으로 업데이트하는 방법이 있습니까? 예외적 인 대답은 틀린 것이 아니라 더 이상 최선의 방법이 아닙니다.
JSharm

@JSharm은 분명히 OP의 마음을 바꿀 수는 없지만 정상에 올 자격이 있다고 생각하는 게시물에 확실히 찬성 투표를 할 수 있습니다. 충분한 사람들이 당신과 똑같은 방식으로 생각하고 행동한다면 언젠가 거기에 도착할 것입니다.) 추신 : 받아 들인 대답에 그늘을 던지지 말고, 팬더가 구문을 계속 지원하는 한 여전히이 질문에 대한 최선의 대답이라고 생각합니다. 아직 당분간있을 것이라고 합리적으로 확신합니다.
cs95

4

열이 많고 하나만 다른 경우 다음을 수행 할 수 있습니다.

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

그런 다음 원하는대로 조직 이름 열의 이름을 바꿀 수 있습니다.


1
df.groupby('Company Name').agg({'Organisation name':'count','Amount':'sum'})\
    .apply(lambda x: x.sort_values(['count','sum'], ascending=False))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.