여유로움
[11.23 화] 빅데이터 분석기사 실기 - Pandas (21~23강) 본문
1. 결측치 확인
# [3-23] df의 행별 결측치를 조사합니다.
df.isna().sum(axis=0)
# [3-24] '측정일시'를 index로 설정하고,
# index 기준으로 오름차순 정렬해서 df1으로 이름 붙입니다.
# 그래프에서 y축으로 사용하려고 합니다.
df1 = df.set_index('측정일시').sort_index()
df1.head()
|
df['컬럼명'] : 1개의 컬럼을 Series로 반환
df[['컬럼명1', '컬럼명2', ...]] : 여러개의 컬럼을 DataFrame으로 반환
df['행이름1':'행이름N'] : 행이름1 ~ 행이름 N 전까지를 반환
df[조건] : 행 중에서 조건이 True인 행을 반환
|
# [3-26] df1에서 '측정소명', '년', '월', '일','오존농도(ppm)', '미세먼지(㎍/㎥)', '초미세먼지(㎍/㎥)'컬럼만
# 추출하여 df_dust 라는 이름을 정의합니다.
df_dust = df1[['측정소명', '년', '월', '일','오존농도(ppm)', '미세먼지(㎍/㎥)', '초미세먼지(㎍/㎥)']]
# [3-27] df_dust의 컬럼별 결측치 개수를 구해봅니다
df_dust.isna().sum()
|
2. DataFrame의 index, columns 설정
|
# [3-29] df_dust의 index를 다시 컬럼으로 사용되도록 합니다.
# 다음 작업인 결측치 삭제를 사용하기 위함
df_dust = df_dust.reset_index()
df_dust.head(2)
|
3. 결측치 제거
DataFrame.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
|
# [3-31] df_dust 에서 ['오존농도(ppm)','미세먼지(㎍/㎥)', '초미세먼지(㎍/㎥)']에서
# 하나라도 결측치가 있는 행을 제거하여 결과를 temp2로 저장합니다.
temp2 = df_dust.dropna(how='any', subset=['오존농도(ppm)','미세먼지(㎍/㎥)', '초미세먼지(㎍/㎥)'])
# df_dust와 temp2의 행의 수 (len)을 확인하여 제거된 행의 개수를 확인합니다.
print(len(df_dust)-len(temp2))
# [3-32] df_dust 에서 ['오존농도(ppm)','미세먼지(㎍/㎥)', '초미세먼지(㎍/㎥)']에서
# 2개 이상의 데이터를 가진 행은 제거하지 않은 결과를 temp3로 저장합니다.
# (= 3개의 정보 중 1개의 데이터만 가진 행을 제거함)
temp3 = df_dust.dropna(thresh=2, subset=['오존농도(ppm)','미세먼지(㎍/㎥)', '초미세먼지(㎍/㎥)'])
# df_dust와 temp3의 행의 수 (len)을 확인하여 제거된 행의 개수를 확인합니다.
print(len(df_dust)-len(temp3))
|
4. groupby 함수
df.groupby(by=[컬럼1, 컬럼2, ...]).함수()
|
# [3-34] df_dust에서 '년', '월'별 '미세먼지(㎍/㎥)' 데이터의 평균을 구해
# DataFrame으로 만들어 meandf 라는 이름을 지정합니다.ㅣ
meandf = df_dust.groupby(['년','월'])[['미세먼지(㎍/㎥)']].mean()
meandf
# [3-35] meandf에서 2017년 6월까지의 데이터만 출력합니다.
meandf.loc[:(2017,6),:]
# [3-36] meandf에 '결측치제거후' 및 '차이'라는 컬럼을 추가합니다.
# '결측치제거후' 컬럼은 temp2에서 '년', '월'별 '미세먼지(㎍/㎥)' 데이터의 평균을 사용합니다.
# '차이' 컬럼은 '미세먼지(㎍/㎥)' - '결측치제거후' 를 사용합니다.
meandf['결측치제거후']=temp2.groupby(['년','월'])['미세먼지(㎍/㎥)'].mean()
meandf['차이']=meandf['미세먼지(㎍/㎥)']-meandf['결측치제거후']
# [3-37] meandf에서 2017년 6월까지의 데이터만 출력합니다.
# 여러 개의 값에 차이가 있는 것을 확인 할 수 있습니다.
meandf.loc[:(2017,6),:]
|
5. 결측치 대체(평균값)
Series.mask(조건, 조건이 참일 때 사용할 값 또는 값 목록)
|
# [3-38] where 연습을 위한 temp 생성
import numpy as np
temp = pd.DataFrame({'A':[np.nan, 2, np.nan, 4],
'B':[7, 8, 9, 10],
'C':[1, 2, 4, 8]})
temp
# temp의 'A' 열에 대해서 결측치인 경우 'B'의 값으로 대체합니다.
temp['A'].mask(temp['A'].isna(), temp['B'])
#temp['A].where(temp['A'].notna(), temp['B'])
# temp의 'A' 열에 대해서 결측치인 경우 'C'의 값으로 대체합니다.
temp['A'].mask(temp['A'].isna(),temp['C'])
|
df.groupby(그룹기준컬럼)[함수를 적용할 컬럼명].transform(함수)
|
# [3-39] df_dust의 일자(년, 월, 일)별 '미세먼지(㎍/㎥)'의 평균을 구합니다.
# 이때, index 변경을 하지 않기 위해 transform을 사용하고, fine_dust라는 이름을 지정합니다.
fine_dust = df_dust.groupby(['측정일시'])['미세먼지(㎍/㎥)'].transform('mean')
fine_dust
# [3-40] df_dust['미세먼지(㎍/㎥)'], fine_dust의 결측치 값의 개수를 구합니다.
df_dust['미세먼지(㎍/㎥)'].isna().sum(), fine_dust.isna().sum()
# [3-41] df_dust의 '미세먼지(㎍/㎥)'의 결측치를 fine_dust의 값으로 채우기 합니다.
# 채우기 한 결과를 다시 df_dust['미세먼지(㎍/㎥)']로 저장합니다.
df_dust['미세먼지(㎍/㎥)'] = df_dust['미세먼지(㎍/㎥)'].mask(df_dust['미세먼지(㎍/㎥)'].isna(), fine_dust)
# [3-43] meandf에 '결측치대체' 및 '차이2'라는 컬럼을 추가합니다.
# '결측치대체' 컬럼은 df_dust에서 '년', '월'별 '미세먼지(㎍/㎥)' 데이터의 평균을 사용합니다.
# '차이2' 컬럼은 '미세먼지(㎍/㎥)' - '결측치대체'를 사용합니다.
meandf['결측치대체'] = df_dust.groupby(['년','월'])['미세먼지(㎍/㎥)'].mean()
meandf['차이2'] = meandf['미세먼지(㎍/㎥)'] - meandf['결측치대체']
# [3-44] meandf에서 2017년 6월까지의 데이터만 출력합니다.
# 차이가 없는 것을 확인합니다.
meandf.loc[:(2017,6),:]
# [3-45] df_dust의 '오존농도(ppm)', '초미세먼지(㎍/㎥)' 컬럼에 대해서도
# '미세먼지(㎍/㎥)'와 같이 동일한 '년', '월', '일'의 평균 값으로 채우기 합니다.
for i in ['오존농도(ppm)', '초미세먼지(㎍/㎥)']:
x = df_dust.groupby('측정일시')[i].transform('mean')
s = df_dust[i]
df_dust[i] = s.mask(s.isna(), x)
|
6. 객체로 저장
df_dust2 = pd.read_csv('fine_dust02.csv') #파일로 저장 후 가져오면 형변환 다시 해야함
df_dust2.isna().sum()
|
import shelve #객체로 저장했다가 가져오면 형변환 다시 할 필요 없음
with shelve.open('mydata') as data:
data['fine_dust02'] = df_dust
import shelve
with shelve.open('mydata') as data:
df_dust3 = data['fine_dust02']
|
7. 분석
# 데이터 값 실수. 소수점 넷째자리까지 표시
pd.options.display.float_format = '{:.2f}'.format
|
행, 열에 모두 group을 지정하여 통계값 구하기
|
# [3-48] df_dust의 월/년 별 미세먼지의 'mean', 'min', 'max' 구하기
# pivot_table 사용, values의 경우 목록으로 지정시와 단독 지정시가 다르게 표시됨
df_dust.pivot_table(index='월',columns='년',values='미세먼지(㎍/㎥)', aggfunc=['mean', 'min', 'max'])
# [3-49] df_dust에서 '측정소명'이 '강남구'인 데이터의
# 월별(index), 년별(columns), 미세먼지 농도 평균을 조회하여 temp로 저장합니다
place = df_dust.loc[df_dust['측정소명']=='강남구',:]
temp = place.pivot_table(index=['월'], columns=['년'], values=['미세먼지(㎍/㎥)'], aggfunc=['mean']) #평균은 기본값이므로 생략하면 평균값이 나옴
temp
|
8. Series
|
# argmin, argmax를 연습하기 위한 Series
s = pd.Series([1, 0, 5, 7, 9, 2, 6, 8],
index=list('ABCDEFGH'))
display(s['A'], s[['A', 'D']], s[s>5], s['C':'F'])
# argmin(), argmax() 구하기
a = s.argmin()
b = s.argmax()
# [3-50] 2016년 ~ 2020년도 미세먼지 농도가 가장 높은 월의 위치
temp = df_dust.pivot_table(index=['년'],columns=['월'], values='미세먼지(㎍/㎥)', aggfunc='mean')
for year in temp.columns:
idx = temp[year].argmax()
print('{}년 미세먼지 농도 높은 월 : {}'.format(year, temp.index[idx]))
# [3-51] 2016년 ~ 2020년도 미세먼지 농도가 가장 낮은 월의 위치
for year in temp.columns:
idx = temp[year].argmin()
print('{}년 미세먼지 농도 높은 월 : {}'.format(year, temp.index[idx]))
# [3-52] 2016년 ~ 2019년 월별 미세먼지 평균을 구해 temp (DataFrame)로 저장합니다.
temp = df_dust.loc[df_dust['년']<=2019,:].groupby('월')[['미세먼지(㎍/㎥)']].mean()
# [3-53] 2020년 월별 미세먼지 평균을 구해 temp에 '미세먼지 2020' 컬럼으로 추가합니다.
temp['미세먼지 2020'] = df_dust.loc[df_dust['년']==2020,:].groupby('월')[['미세먼지(㎍/㎥)']].mean()
temp
|
출처 : 유튜브 강의 EduAtoZ
'셀프스터디 > 빅데이터 분석기사' 카테고리의 다른 글
[11.27 토] 빅데이터 분석기사 실기 - Pandas (30~35강) (0) | 2021.11.27 |
---|---|
[11.24 수] 빅데이터 분석기사 실기 - Pandas (24~29강) (0) | 2021.11.24 |
[11.22 월] 빅데이터 분석기사 실기 - Pandas (17~20강) (0) | 2021.11.22 |
[11.21 일] 빅데이터 분석기사 실기 - Pandas (10~16강) (0) | 2021.11.21 |
[11.17 수] 빅데이터 분석기사 실기 - Pandas (6~9강) (0) | 2021.11.17 |