본문 바로가기
국비 교육/데이터

[데이터 분석] Pandas 실습 문제 - 1 (시애틀 강수량 데이터 분석)

by 육츠 2023. 11. 15.

데이터 로딩

import pandas as pd
import numpy as np

필요한 패키지 로딩

df = pd.read_csv('Seattle2014.csv')

pd.read_* 을 통해 csv 파일을 읽어온다.

1-1. 데이터 모양 및 정보 확인

df.shape

(365,17) # 365행 17열로 구성되어 있다.(1년간의 시애틀 분석이므로 365행이다.)

df.head()

df.info()

df.isna().sum()

결측치 행이 존재하는지 확인한다. isna() 는 논리형의 값으로 나오므로 sum() 을 하여 True 의 값을 합한다.

 

필요하지 않은 컬럼 삭제 (STATION, STATION_NAME)

df.drop(['STATION','STATION_NAME'],axis=1,inplace=True) # axis=1 컬럼삭제
# df = df.drop(['STATION','STATION_NAME'],axis=1)

 

DATE를 날짜 형식으로 수정

기존 DATE 컬럼의 타입 int -> str로 변경 후 날짜 형식으로 변경

df['DATE'] = df['DATE'].astype(str)
df['DATE'] = pd.to_datetime(df['DATE'])

# df['DATE'] = pd.to_datetime(df['DATE'].astype(str))
# df['DATE'] = pd.to_datetime(df['DATE'],format='%Y%m%d') 
# 포맷을 지정하면 바로 데이트타임으로 가능

기존의 int 타입을 바로 datetime() 으로 변경하면 숫자가 이상하게 나오는 것을 확인할 수 있다.
때문에 string 타입으로 변환 후에 datetime 으로 변경하거나 아니면 int 타입에서 포맷을 지정하여 바로 데이트 타임으로 변경하는 방법이 있다.

 

날짜 컬럼을 인덱스로 변경

# df.set_index(df['DATE'],inplace= True)
df = df.set_index(df['DATE'])
df.head()

set_index() : 열 중에 한 데이터를 인덱스로 변경한다.
drop() 과 같이 set_index() 도 데이터 프레임을 변경시키는 것은 바로 원본에 적용되지 않기 때문에 inplace = True 를 사용하거나 또는 원본 데이터에 덮어씌워야 한다.

 

강수량('PRCP')이 많은 날 상위 10일 출력

df['PRCP'].sort_values(ascending= False).head(10)
# df.sort_values(by='PRCP', ascending= False)[['PRCP']].head(10) # 강수량만

sort_values() 값을 정렬한다. ascending =  False 를 사용하여 내림차순 -> 오름차순으로 변경하여 상위 10개의 데이터만 뽑아 온다.

 

1월 강수량만 출력

prcp_jan =df[df.index.month==1]
prcp_jan['PRCP']

# df['PRCP'][df.index.month==1]

 

1년동안 강수량이 40미만으로 내린 날이 몇일인가?

len(df[df['PRCP']<40])

# np.sum(df['PRCP']<40) # 불린
# df[df['PRCP']<40]['PRCP'].count() # NOTNULL 값을 포함하지 않은 레코드의 개수만
# df[df['PRCP']<40]['PRCP'].shape[0]

len() 을 사용하여 데이터의 길이를 구함
sum(),count() 을 사용하여 True 의 합을 구함
df[df['PRCP']<40]['PRCP'].shape 이 (277,)인 튜플의 형태이므로  shape[0] True 인 것들의 개수만 출력한다.

 

1월에 내린 강수량의 합과 평균 강수량

print('합:' , prcp_jan['PRCP'].sum(axis=0))
print('평균:', prcp_jan['PRCP'].mean(axis=0))

df['PRCP'][df.index.month==1].agg(['sum','mean']).apply(lambda x: np.round(x,2))
# 반올림 : np.round()
# .apply() : 이유 넘어오는 값이 시리즈니까

apply() 안에 익명함수 lambda 를 이용하여 반올림 평균값을 반올림.

 

2월에 내린 강수량의 합과 평균 강수량

prcp_Feb = df[df.index.month ==2]
print('합:', prcp_Feb['PRCP'].sum(axis = 0))
print('평균:', prcp_Feb['PRCP'].mean(axis = 0))

위 1월과 같은 방식으로 풀이하면 된다.