코드 프레소 [파이썬으로 배우는 데이터 분석: Pandas] 강의 내용 정리
# 데이터 그룹화..?
강의 자료에서 데이터 그룹화의 예시에 아주 적합한 시각 자료가 있어 이를 활용하여 데이터 그룹화에 대해 설명하도록 하겠다.
위의 데이터에는 노선 번호별 승하차에 대한 정보가 담겨있다. 이 데이터를 그대로 사용하면 전체 데이터를 정확히 분석하기에 어려움이 있다. 따라서 이를 노선별로 그룹화하는 과정이 필요하다
위의 그림은 노선별로 mean()을 적용하여 노선별로 승하차 평균이라는 결과 집계를 얻을 수 있다. 데이터 그룹화 연산은 아래 과정을 거친다.
- 전체 데이터를 그룹별로 나눈다.(split)
- 각 그룹별로 집계함수를 적용(apply)
- 그룹별로 집계결과를 하나로 합친다.(combine)
Pandas 라이브러리에서는 데이터 그룹화를 위해 pandas.DataFrame.groupby()를 활용한다.
# API Reference
API Reference::pandas.DataFrame.groupby()
# parameter 정리
- by (mapping, function, label, pd.Grouper, or list of such): 그룹을 결정하는 기준.
- 함수가 전달되면, 객체의 인덱스에 대해 함수가 호출된다.
- 딕셔너리나 시리즈가 전달되면 그 값을 사용해 그룹을 결정한다.
- 리스트나 ndarray가 전달되면, 해당 값들을 그룹화의 기준으로 사용한다.
- 컬럼 이름을 기준으로 그룹화하려면 레이블이나 레이블 목록을 전달한다.
- 튜플은 단일 키로 해석된다.
- axis ({0 or ‘index’, 1 or ‘columns’}, 기본값 0):
- 행(0) 또는 열(1)을 기준으로 데이터를 분할한다.
- axis=1은 더 이상 사용되지 않으며, 미래 버전에서 제거될 예정이므로 frame.T.groupby(...)를 대신 사용할 것을 권장한다.
- level (int, level name, or sequence, 기본값 None):
- MultiIndex가 있는 경우, 특정 레벨 또는 레벨들을 기준으로 그룹화한다. by와 level을 동시에 지정할 수 없다.
- as_index (bool, 기본값 True):
- 그룹 레이블을 인덱스로 반환할지 여부를 지정한다. as_index=False는 SQL 스타일의 그룹화된 출력과 유사하다.
- 필터링 작업에는 영향을 미치지 않는다 (예: head(), tail(), nth() 등).
- sort (bool, 기본값 True):
- 그룹 키를 정렬할지 여부. 성능 향상을 위해 False로 설정할 수 있다.
- 각 그룹 내의 관측치 순서에는 영향을 미치지 않으며, sort=False로 설정하면 원래 데이터프레임 순서대로 그룹이 나타난다.
- group_keys (bool, 기본값 True):
- apply() 호출 시 그룹 키를 인덱스에 추가할지 여부를 결정한다.
- 결과 인덱스와 컬럼이 입력과 일치하면 기본적으로 그룹 키는 포함되지 않지만, 그렇지 않은 경우에는 포함된다.
- observed (bool, 기본값 False):
- 카테고리형 데이터 그룹화 시 사용. True일 경우 관찰된 값만 표시하고, False일 경우 모든 값을 표시한다.
- 향후 버전에서 기본값이 True로 변경될 예정.
- dropna (bool, 기본값 True):
- 그룹 키에 NA 값이 있는 경우, 해당 행/열을 드롭할지 여부를 지정한다. False로 설정하면 NA 값도 그룹의 키로 처리된다.
# 예시코드 : 데이터 그룹화 실습
import pandas as pd
import numpy as np
# 실습 데이터 생성
sample = {'product':['a','b','a','b','a','b','a','a'],
'sensor':['s1','s1','s2','s3','s2','s2','s1','s3'],
'x':np.arange(1,9),
'y':np.arange(5,13)}
df = pd.DataFrame(data=sample)
print(df)
'''
product 컬럼 기준으로 그룹화하기
'''
print('\n#1 groupby-product')
grouped_product = df.groupby('product')
print(grouped_product)
'''
grouped_product 에 저장된 key와 value 출력하기
'''
print('\n#2 key & value')
for key, value in grouped_product:
print("-----------------------")
print("key :", key)
print("value :\n", value)
product sensor x y
0 a s1 1 5
1 b s1 2 6
2 a s2 3 7
3 b s3 4 8
4 a s2 5 9
5 b s2 6 10
6 a s1 7 11
7 a s3 8 12
#1 groupby-product
<pandas.core.groupby.generic.DataFrameGroupBy object at 0x7f9b6769bee0>
#2 key & value
-----------------------
key : a
value :
product sensor x y
0 a s1 1 5
2 a s2 3 7
4 a s2 5 9
6 a s1 7 11
7 a s3 8 12
-----------------------
key : b
value :
product sensor x y
1 b s1 2 6
3 b s3 4 8
5 b s2 6 10
# 예시코드: 데이터 그룹화 결과에 집계함수 적용
import pandas as pd
import numpy as np
# 실습 데이터 생성
sample = {'product':['a','b','a','b','a','b','a','a'],
'sensor':['s1','s1','s2','s3','s2','s2','s1','s3'],
'x':np.arange(1,9),
'y':np.arange(5,13)}
df = pd.DataFrame(data=sample)
print(df)
'''
groupby 결과에 집계함수 적용하기
'''
print('\n#3 groupby-product')
grouped_product = df.groupby('product').sum()
print(grouped_product)
'''
product, sensor 기준으로 그룹화하기
'''
print('\n#4 groupby-product,sensor')
grouped_product = df.groupby(['product','sensor']).sum()
print(grouped_product)
'''
그룹화한 뒤 x 컬럼에 대해서만 집계함수 적용하기
'''
print('\n#5 groupby-product,sensor')
grouped_product = df.groupby(['product','sensor'])['x'].sum()
print(grouped_product)
'''
그룹화한 뒤 컬럼별 다른 집계함수 적용하기
'''
print('\n#6 groupby-product,sensor')
condition = {'x':'max', 'y':'min'}
grouped_product = df.groupby(['product','sensor']).agg(condition)
print(grouped_product)
product sensor x y
0 a s1 1 5
1 b s1 2 6
2 a s2 3 7
3 b s3 4 8
4 a s2 5 9
5 b s2 6 10
6 a s1 7 11
7 a s3 8 12
#3 groupby-product
x y
product
a 24 44
b 12 24
#4 groupby-product,sensor
x y
product sensor
a s1 8 16
s2 8 16
s3 8 12
b s1 2 6
s2 6 10
s3 4 8
#5 groupby-product,sensor
product sensor
a s1 8
s2 8
s3 8
b s1 2
s2 6
s3 4
Name: x, dtype: int64
#6 groupby-product,sensor
x y
product sensor
a s1 7 5
s2 5 7
s3 8 12
b s1 2 6
s2 6 10
s3 4 8
'공부한 것들.. > Pandas' 카테고리의 다른 글
Pandas 데이터 합치기 (1) | 2024.09.14 |
---|---|
Pandas 집계함수 (0) | 2024.09.14 |
Pandas 인덱싱(Indexing) & 슬라이싱(Slicing) (0) | 2024.09.14 |
Pandas 결측치 이해 및 결측치 처리 (2) | 2024.09.14 |
Pandas 데이터 파일 읽기 (1) | 2024.09.14 |