pandas GroupBy를 사용하여 각 그룹 (예 : 개수, 평균 등)에 대한 통계를 얻으십니까?


438

데이터 프레임이 df있고 여러 열을 사용합니다 groupby.

df['col1','col2','col3','col4'].groupby(['col1','col2']).mean()

위의 방법으로 필요한 테이블 (데이터 프레임)을 거의 얻습니다. 누락 된 것은 각 그룹의 행 수를 포함하는 추가 열입니다. 즉, 나는 의미가 있지만 이러한 수단을 얻는 데 사용 된 숫자의 수를 알고 싶습니다. 예를 들어 첫 번째 그룹에는 8 개의 값이 있고 두 번째 그룹에는 10 등이 있습니다.

간단히 말해서 : 데이터 프레임에 대한 그룹 별 통계는 어떻게 얻 습니까?

답변:


427

groupby객체의 agg기능을 할 목록을 취할 수있는 여러 가지 집계 방법을 적용 번에. 이를 통해 필요한 결과를 얻을 수 있습니다.

df[['col1', 'col2', 'col3', 'col4']].groupby(['col1', 'col2']).agg(['mean', 'count'])

2
목록이 되려면 열 참조가 필요하다고 생각합니다. 당신은 아마 의미합니까 : df[['col1','col2','col3','col4']].groupby(['col1','col2']).agg(['mean', 'count'])
rysqui

43
이렇게하면 4 개의 열이 생성되지만 하나만 얻는 방법은 무엇입니까? (질문은 "추가 열"을 요구하며 그것이 내가 원하는 것이
기도합니다

16
count그룹 당 하나의 열만 얻으려면 내 대답을 참조하십시오 .
Pedro M Duarte

Counts라는 별도의 그룹이 있고 그룹화 된 유형의 행을 계산하는 대신 Counts 열을 추가해야합니까?
Abhishek Bhatia

@Jaanresult = df['col1','col2','col3','col4'].groupby(['col1', 'col2']).mean() ; counts = times.groupby(['col1', 'col2']).size() ; result['count'] = counts
alvitawa

912

빠른 답변 :

그룹당 행 수를 얻는 가장 간단한 방법은을 호출 .size()하는 것입니다 Series.

df.groupby(['col1','col2']).size()


일반적으로이 결과를 DataFrame(대신 Series)으로 원하므로 다음을 수행 할 수 있습니다.

df.groupby(['col1', 'col2']).size().reset_index(name='counts')


각 그룹의 행 수 및 기타 통계를 계산하는 방법을 찾으려면 아래에서 계속 읽으십시오.


자세한 예 :

다음 예제 데이터 프레임을 고려하십시오.

In [2]: df
Out[2]: 
  col1 col2  col3  col4  col5  col6
0    A    B  0.20 -0.61 -0.49  1.49
1    A    B -1.53 -1.01 -0.39  1.82
2    A    B -0.44  0.27  0.72  0.11
3    A    B  0.28 -1.32  0.38  0.18
4    C    D  0.12  0.59  0.81  0.66
5    C    D -0.13 -1.65 -1.64  0.50
6    C    D -1.42 -0.11 -0.18 -0.44
7    E    F -0.00  1.42 -0.26  1.17
8    E    F  0.91 -0.47  1.35 -0.34
9    G    H  1.48 -0.63 -1.14  0.17

먼저 .size()행 수를 얻는 데 사용합시다 :

In [3]: df.groupby(['col1', 'col2']).size()
Out[3]: 
col1  col2
A     B       4
C     D       3
E     F       2
G     H       1
dtype: int64

그런 다음 .size().reset_index(name='counts')행 수를 얻는 데 사용합시다 .

In [4]: df.groupby(['col1', 'col2']).size().reset_index(name='counts')
Out[4]: 
  col1 col2  counts
0    A    B       4
1    C    D       3
2    E    F       2
3    G    H       1


더 많은 통계에 대한 결과 포함

그룹화 된 데이터에 대한 통계를 계산하려면 일반적으로 다음과 같습니다.

In [5]: (df
   ...: .groupby(['col1', 'col2'])
   ...: .agg({
   ...:     'col3': ['mean', 'count'], 
   ...:     'col4': ['median', 'min', 'count']
   ...: }))
Out[5]: 
            col4                  col3      
          median   min count      mean count
col1 col2                                   
A    B    -0.810 -1.32     4 -0.372500     4
C    D    -0.110 -1.65     3 -0.476667     3
E    F     0.475 -0.47     2  0.455000     2
G    H    -0.630 -0.63     1  1.480000     1

위의 결과는 중첩 된 열 레이블과 행 수가 열마다 다르기 때문에 처리하기가 약간 성가시다.

출력을 더 잘 제어하려면 일반적으로 통계를 개별 집계로 분할 한 다음를 사용하여 결합 join합니다. 다음과 같이 보입니다 :

In [6]: gb = df.groupby(['col1', 'col2'])
   ...: counts = gb.size().to_frame(name='counts')
   ...: (counts
   ...:  .join(gb.agg({'col3': 'mean'}).rename(columns={'col3': 'col3_mean'}))
   ...:  .join(gb.agg({'col4': 'median'}).rename(columns={'col4': 'col4_median'}))
   ...:  .join(gb.agg({'col4': 'min'}).rename(columns={'col4': 'col4_min'}))
   ...:  .reset_index()
   ...: )
   ...: 
Out[6]: 
  col1 col2  counts  col3_mean  col4_median  col4_min
0    A    B       4  -0.372500       -0.810     -1.32
1    C    D       3  -0.476667       -0.110     -1.65
2    E    F       2   0.455000        0.475     -0.47
3    G    H       1   1.480000       -0.630     -0.63



각주

테스트 데이터를 생성하는 데 사용되는 코드는 다음과 같습니다.

In [1]: import numpy as np
   ...: import pandas as pd 
   ...: 
   ...: keys = np.array([
   ...:         ['A', 'B'],
   ...:         ['A', 'B'],
   ...:         ['A', 'B'],
   ...:         ['A', 'B'],
   ...:         ['C', 'D'],
   ...:         ['C', 'D'],
   ...:         ['C', 'D'],
   ...:         ['E', 'F'],
   ...:         ['E', 'F'],
   ...:         ['G', 'H'] 
   ...:         ])
   ...: 
   ...: df = pd.DataFrame(
   ...:     np.hstack([keys,np.random.randn(10,4).round(2)]), 
   ...:     columns = ['col1', 'col2', 'col3', 'col4', 'col5', 'col6']
   ...: )
   ...: 
   ...: df[['col3', 'col4', 'col5', 'col6']] = \
   ...:     df[['col3', 'col4', 'col5', 'col6']].astype(float)
   ...: 


기권:

집계하는 일부 컬럼에 널 (NULL) 값이있는 경우 실제로 그룹 행 수를 각 컬럼에 대한 독립 집계로 간주하려고합니다. 그렇지 않으면 팬더가 NaN평균 계산에서 항목을 알려주지 않기 때문에 평균과 같은 것을 계산하는 데 실제로 사용되는 레코드 수에 대해 잘못 판단 할 수 있습니다 .


1
이봐, 나는 당신의 솔루션, 특히 마지막으로 메소드 체인을 사용하는 것을 정말로 좋아합니다. 그러나 다른 집계 함수를 다른 열에 적용해야하는 경우가 종종 있으므로 pd.concat을 사용하여 결과 데이터 프레임을 연결할 수도 있습니다. 이것은 종속 체인보다 읽기 쉽다
Quickbeam2k1

4
좋은 해결책이지만 In [5]: counts_df = pd.DataFrame(df.groupby('col1').size().rename('counts')), 추가 분석을 위해 데이터 프레임을 조작하려면 size ()를 새 열로 설정하는 것이 좋습니다.counts_df = pd.DataFrame(df.groupby('col1').size().reset_index(name='counts')
LancelotHolmes

2
"더 많은 통계에 대한 결과 포함"비트에 감사드립니다! 나의 다음 검색 열에 결과 multiindex 평탄화에 대한 이었기 때문에, 여기 대답에 링크를 겁니다 : stackoverflow.com/a/50558529/1026
Nickolay

큰! isnull이 쿼리에 추가 하여 한 열에 추가하는 방법에 대한 힌트 를 제공해 주시겠습니까? 'col4': ['median', 'min', 'count', 'isnull']
Peter.k

38

그들 모두를 지배하는 하나의 기능 : GroupBy.describe

반환 count, mean, std, 및 기타 유용한 통계 당 그룹.

df.groupby(['col1', 'col2'])['col3', 'col4'].describe()

# Setup
np.random.seed(0)
df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar',
                          'foo', 'bar', 'foo', 'foo'],
                   'B' : ['one', 'one', 'two', 'three',
                          'two', 'two', 'one', 'three'],
                   'C' : np.random.randn(8),
                   'D' : np.random.randn(8)})

from IPython.display import display

with pd.option_context('precision', 2):
    display(df.groupby(['A', 'B'])['C'].describe())

           count  mean   std   min   25%   50%   75%   max
A   B                                                     
bar one      1.0  0.40   NaN  0.40  0.40  0.40  0.40  0.40
    three    1.0  2.24   NaN  2.24  2.24  2.24  2.24  2.24
    two      1.0 -0.98   NaN -0.98 -0.98 -0.98 -0.98 -0.98
foo one      2.0  1.36  0.58  0.95  1.15  1.36  1.56  1.76
    three    1.0 -0.15   NaN -0.15 -0.15 -0.15 -0.15 -0.15
    two      2.0  1.42  0.63  0.98  1.20  1.42  1.65  1.87

특정 통계를 얻으려면 통계를 선택하십시오.

df.groupby(['A', 'B'])['C'].describe()[['count', 'mean']]

           count      mean
A   B                     
bar one      1.0  0.400157
    three    1.0  2.240893
    two      1.0 -0.977278
foo one      2.0  1.357070
    three    1.0 -0.151357
    two      2.0  1.423148

describe여러 열에 대한 작업 (변화 ['C']['C', 'D']는 모두-어떻게되는지 - 또는 제거, 결과는 MultiIndexed가 dataframe을 원주)입니다.

문자열 데이터에 대한 다른 통계도 얻습니다. 다음은 예입니다.

df2 = df.assign(D=list('aaabbccc')).sample(n=100, replace=True)

with pd.option_context('precision', 2):
    display(df2.groupby(['A', 'B'])
               .describe(include='all')
               .dropna(how='all', axis=1))

              C                                                   D                
          count  mean       std   min   25%   50%   75%   max count unique top freq
A   B                                                                              
bar one    14.0  0.40  5.76e-17  0.40  0.40  0.40  0.40  0.40    14      1   a   14
    three  14.0  2.24  4.61e-16  2.24  2.24  2.24  2.24  2.24    14      1   b   14
    two     9.0 -0.98  0.00e+00 -0.98 -0.98 -0.98 -0.98 -0.98     9      1   c    9
foo one    22.0  1.43  4.10e-01  0.95  0.95  1.76  1.76  1.76    22      2   a   13
    three  15.0 -0.15  0.00e+00 -0.15 -0.15 -0.15 -0.15 -0.15    15      1   c   15
    two    26.0  1.49  4.48e-01  0.98  0.98  1.87  1.87  1.87    26      2   b   15

자세한 내용은 설명서를 참조하십시오 .


모든 분포가 정상적인 것은 아닙니다. IQR은 놀랍습니다.
브래드

7

groupby와 count를 사용하면 쉽게 할 수 있습니다. 그러나 reset_index ()를 사용해야합니다.

df[['col1','col2','col3','col4']].groupby(['col1','col2']).count().\
reset_index()

3
이 솔루션은 열에 null 값이없는 한 작동합니다. 그렇지 않으면 오도 될 수 있습니다 (그룹 별 실제 관측치 수보다 적음).
Adrien Pacifico

4

여러 통계를 얻으려면 색인을 축소하고 열 이름을 유지하십시오.

df = df.groupby(['col1','col2']).agg(['mean', 'count'])
df.columns = [ ' '.join(str(i) for i in col) for col in df.columns]
df.reset_index(inplace=True)
df

생산 :

** 여기에 이미지 설명을 입력하십시오 **


1

아래 예제와 같이 그룹 객체를 만들고 메소드를 호출하십시오.

grp = df.groupby(['col1',  'col2',  'col3']) 

grp.max() 
grp.mean() 
grp.describe() 

1

이 코드를 시도하십시오

new_column=df[['col1', 'col2', 'col3', 'col4']].groupby(['col1', 'col2']).count()
df['count_it']=new_column
df

코드에 'count it'이라는 열이 각 그룹의 수를 추가한다고 생각합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.