본문 바로가기

Computer/Pandas

Pandas groupby (2)

반응형

Pandas groupby (1)


지난 포스트에서 pandas groupby 함수의 동작 원리, split-apply-combine에 대해 알아봤습니다. 궁금한 점은 apply 단계에서 단 하나의 operation만 적용할 수 있는 것일까요? 그리고 구현된 mean, median, count 등의 함수 말고 우리가 따로 구현한 통계치는 어떻게 볼 수 있을까요? 이것은 GroupBy 객체에 .agg (aggregation) 메소드를 통해 실행할 수 있습니다.

groupby operations

지난 포스트와 같은 데이터를 이용해 state, gender에 대해 groupby를 수행하고 last_name, first_name, party 칼럼에 대해서 통계치를 보도록 하겠습니다.

grouped = df.groupby(['state', 'gender'])[['last_name', 'party']]

.agg 함수를 사용하려면 .agg 함수의 인자로 통계치를 전달합니다. 이때, 여러 통계치를 리스트나 튜플을 통해서 전달해서 둘 이상의 operation을 수행할 수 있습니다. 

>>> grouped.agg(('first', 'last', 'count'))
             last_name                 ...       party      
                 first           last  ...        last count
state gender                           ...                  
AK    F            NaN            NaN  ...         NaN     0
      M         Waskey         Begich  ...    Democrat    14
AL    F         Graves           Roby  ...  Republican     4
      M        Crowell          Jones  ...    Democrat   205
AR    F       Oldfield        Lincoln  ...    Democrat     5
                ...            ...  ...         ...   ...
WI    M         Martin  Sensenbrenner  ...  Republican   198
WV    F            Kee            Kee  ...    Democrat     1
      M          Blair        Jenkins  ...  Republican   119
WY    F          Cubin          Cubin  ...  Republican     1
      M       Nuckolls           Enzi  ...  Republican    39

이때 column을 보면 MultiIndex 형태로 되는데, 다음과 같이 인덱싱하면 원하는 칼럼의 통계치를 선택적으로 볼 수 있고 .loc 메소드를 이용해서 행을 기준으로 인덱싱할 수 있습니다.

>>> grouped.agg(('first', 'last', 'count'))['party']
                               first        last  count
state gender                                           
AK    F                          NaN         NaN      0
      M                     Democrat    Democrat     14
AL    F                     Democrat  Republican      4
      M                   Republican    Democrat    205
AR    F                     Democrat    Democrat      5
                              ...         ...    ...
WI    M                     Democrat  Republican    198
WV    F                     Democrat    Democrat      1
      M       Unconditional Unionist  Republican    119
WY    F                   Republican  Republican      1
      M                     Democrat  Republican     39
[116 rows x 3 columns]

>>> grouped.agg(('first', 'last', 'count'))['party', 'count']
state  gender
AK     F           0
       M          14
AL     F           4
       M         205
AR     F           5
                ... 
WI     M         198
WV     F           1
       M         119
WY     F           1
       M          39
Name: (party, count), Length: 116, dtype: int64

>>> grouped.agg(('first', 'last', 'count')).loc[('AK', 'M'), 'party']
first    Democrat
last     Democrat
count          14
Name: (AK, M), dtype: object

.agg() 메소드를 이용하면 칼럼 별로 서로 다른 통계치를 볼 수 있습니다. 이때, .agg() 메소드 인자로 각 칼럼 별 보고 싶은 통계치의 딕셔너리를 전달합니다.

>>> grouped = df.groupby(['state', 'gender'])
>>> grouped.agg({'last_name': 'count', 'party': ('first', 'count')})
             last_name                   party      
                 count                   first count
state gender                                        
AK    F              0                     NaN     0
      M             16                Democrat    14
AL    F              4                Democrat     4
      M            205              Republican   205
AR    F              5                Democrat     5
                ...                     ...   ...
WI    M            198                Democrat   198
WV    F              1                Democrat     1
      M            119  Unconditional Unionist   119
WY    F              1              Republican     1
      M             39                Democrat    39
[116 rows x 3 columns]

 


Pandas groupby (3)

반응형

'Computer > Pandas' 카테고리의 다른 글

Pandas groupby (3)  (0) 2021.08.14
Pandas - SettingWithCopyWarning  (0) 2021.08.11
Pandas groupby (1)  (0) 2021.08.07
Pandas Categorical Data  (0) 2021.08.01
Onehot 인코딩의 역변환 (inverse transform)  (0) 2021.07.25