akaSonny
[python/pandas] DataFrame groupby 이용하기 본문
(TMI) 공부 배경
데이터를 다루다 보면 기간별로 평균을 내야될 때가 있는데, 나는 그냥 무식하게 인덱싱을 해서 평균을 구했었다.
ex) 1분 단위의 데이터를 1시간 평균을 내고 싶을 때는 np.mean(data[i:i+60]) .... 이렇게
그런데 요즘에 사용하는 데이터를 보니까 missing data가 있을 때 어떤 특정한 값으로 채워주는게 아니라 그냥 그 시간대의 데이터를 빼버려서 (!) 저 방법은 쓸 수 없게 되었다 흑흑
그래서 찾아보니 dataframe과 datetime을 이용하면 내가 원하는 일을 할 수 있었다!! 이렇게 좋은 게 있을 수가!
| pandas.DataFrame.groupby
말 그대로 데이터들을 특정조건으로 그룹화 시켜주는 함수.
예제)
df = pd.DataFrame({'Animal': ['Falcon', 'Falcon', 'Parrot', 'Parrot'],
'Max Speed': [380., 370., 24., 26]})
print(df)
# Animal Max Speed
# 0 Falcon 380.0
# 1 Falcon 370.0
# 2 Parrot 24.0
# 3 Parrot 26.0
위와 같이 동물들의 최대 속도를 기록한 DataFrame이 있을 때, 각 동물 별 최대속도의 평균 구하는 방법은 다음과 같다.
df.gropuby(['Animal']).mean()
# Max Speed
# Animal
# Falcon 375.0
# Parrot 25.0
이제 내가 하고 싶었던, 데이터의 시간별 평균값 (00시 평균값, 01시 평균값 ...)을 구하는 방법에 적용시켜 보자.
1. DataFrame 만들기
첫번째 column에는 datetime 형식의 시간 데이터가 10분 간격으로 들어가고, 다른 열에는 랜덤한 값이 들어가도록 구성하였다.
import datetime
t = datetime.datetime(2023, 6, 1, 0, 0)
time = [t]
for i in range(49):
t += datetime.timedelta(minutes=10)
time.append(t)
A = np.random.randn(50)
df = pd.DataFrame({'time': time, 'A': A})
print(df)
# time A
# 0 2023-06-01 00:00:00 0.073166
# 1 2023-06-01 00:10:00 1.465439
# 2 2023-06-01 00:20:00 0.291239
# 3 2023-06-01 00:30:00 -0.524980
# 4 2023-06-01 00:40:00 0.959027
# 5 2023-06-01 00:50:00 -1.020610
# 6 2023-06-01 01:00:00 -0.889767
| pandas.Series.dt
Series의 값들을 datetime-like 형식처럼 사용할 수 있게 만드는 함수이다.
우리가 여기서 그룹화시키고 싶은 것은 'time'열에 있는 데이터의 "시간"이므로, 이 함수를 사용해 시간만 뽑아낼 수 있다.
df['time'].dt.hour
# 0 0
# 1 0
# 2 0
# 3 0
# 4 0
# 5 0
# 6 1
# 7 1
# 8 1
# 9 1
# 10 1
# 11 1
# 12 2
2. 1시간 단위로 평균내기
위에서 시간만 뽑아내는 것을 배웠으니까 이를 groupby에 적용시켜 평균을 구하면 끝이다!
df.groupby([df['time'].dt.hour]).mean()
# A
# time
# 0 0.207213
# 1 -0.842211
# 2 -0.547638
# 3 0.265708
# 4 -0.467534
# 5 -0.534232
# 6 0.451525
# 7 0.706867
# 8 0.046997
+ )
만약 여러 날이 함께 있는 데이터일 경우, groupby 안에 날짜와 시간에 대해서 모두 묶어주면 된다.
조건을 쉼표로 구분해 다음과 같이 작성
df.groupby([df['time'].dt.day, df['time'].dt.hour]).mean()
++)
mean 말고도 std, var, sum, median 등 다양한 통계량 산출이 가능하다.
참조
https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.groupby.html
https://pandas.pydata.org/docs/reference/api/pandas.Series.dt.html
'Study (Programming) > Python' 카테고리의 다른 글
[Numpy] numpy의 random 모듈로 다양한 확률 분포 난수 생성하기 (0) | 2023.08.10 |
---|---|
[pandas] DataFrame 열&행 삭제 / 삽입 (0) | 2023.07.10 |
[python/pandas] DataFrame csv 파일 읽기, 인덱스 찾기 (0) | 2023.04.25 |
[파이썬/python] 반복문으로 변수 만들기 (globals) (1) | 2023.03.22 |
활성화 함수 (Activation Function) 정리 (0) | 2023.01.05 |