빅데이터 분석기사/작업 유형 1 (pd)
5/15 결측치 제거하기
유방울
2023. 5. 16. 18:24
결측치 제거에 사용되는 메서드
df.dropna() 중에서
df.dropna(how='all', subset =['컬럼'..]) 모든 데이터가 결측치인 행 삭제 + 지정된 컬럼만 삭제 검색 대상
# [3-30] df_dust 에서 ['오존농도(ppm)','미세먼지(㎍/㎥)', '초미세먼지(㎍/㎥)']에서
# 모든 데이터가 결측치인 행을 제거하여 결과를 temp1으로 저장합니다
temp1 = df_dust.dropna(how='all',subset=['오존농도(ppm)','미세먼지(㎍/㎥)', '초미세먼지(㎍/㎥)'])
# df_dust와 temp1의 행의 수 (len)을 확인하여 제거된 행의 개수를 확인합니다.
print(len(df_dust)-len(temp1))
df.dropna(how='all', subset =['컬럼'..]) 결측치가 하나라도 포함된 행 삭제
이를 temp2 저장
# [3-31] df_dust 에서 ['오존농도(ppm)','미세먼지(㎍/㎥)', '초미세먼지(㎍/㎥)']에서
# 하나라도 결측치가 있는 행을 제거하여 결과를 temp2로 저장합니다.
temp2 = df_dust.dropna(how='any',subset=['오존농도(ppm)','미세먼지(㎍/㎥)', '초미세먼지(㎍/㎥)'])
# df_dust와 temp2의 행의 수 (len)을 확인하여 제거된 행의 개수를 확인합니다.
print(len(df_dust)-len(temp2))
df.dropna(thresh = 2, subset =['컬럼'..]) 2개 이상이 데이터를 가진 행은 삭제 안함
# [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))
히트맵으로 결측치 제거 확인
# [3-33] temp1, temp2, temp3의 '오존농도(ppm)':'초미세먼지(㎍/㎥)'에 대한 결측치 heatmap을 그려봅니다.
# temp1, temp3는 부분적으로 결측치가 남아있고, temp2는 결측치가 없습니다.
plt.figure(figsize=(7, 8))
sns.heatmap(temp2.loc[:, '오존농도(ppm)':'초미세먼지(㎍/㎥)'].isna(), cbar=False)
plt.show()
meandf 데이터프레임에 년, 월별 미세먼저 데이터 평균 저장
# [3-34] df_dust에서 '년', '월'별 '미세먼지(㎍/㎥)' 데이터의 평균을 구해
# DataFrame으로 만들어 meandf 라는 이름을 지정합니다.ㅣ
# 그룹 기준으로 여러개를 지정함 -> 멀티인덱스 만들어짐
meandf = df_dust.groupby(['년','월'])[['미세먼지(㎍/㎥)']].mean()
meandf
미세먼지(㎍/㎥)
년 월
2016 1 52.693844
2 48.283273
3 66.799503
4 73.327039
5 58.624172
6 47.872304
7 35.531092
8 37.124378
9 40.013841
10 40.191363
11 54.729965
12 50.693522
2017 1 55.719138
2 49.554029
3 64.532392
4 59.582549
5 66.029826
6 43.878112
7 36.667496
8 24.564570
9 36.624786
10 32.496689
11 45.322222
12 52.992327
meandf 데이터프레임을 2017,6 데이터만 출력
# [3-35] meandf에서 2017년 6월까지의 데이터만 출력합니다.
meandf.loc[:(2017,6),:]
미세먼지(㎍/㎥)
년 월
2016 1 52.693844
2 48.283273
3 66.799503
4 73.327039
5 58.624172
6 47.872304
7 35.531092
8 37.124378
9 40.013841
10 40.191363
11 54.729965
12 50.693522
2017 1 55.719138
2 49.554029
3 64.532392
4 59.582549
5 66.029826
6 43.878112
결측치 제거 전 후 차이 비교 칼럼 추가
결측치제거 컬럼 추가
차이 컬럼 추가
# [3-36] meandf에 '결측치제거후' 및 '차이'라는 컬럼을 추가합니다.
# '결측치제거후' 컬럼은 temp2에서 '년', '월'별 '미세먼지(㎍/㎥)' 데이터의 평균을 사용합니다.
# '차이' 컬럼은 '미세먼지(㎍/㎥)' - '결측치제거후' 를 사용합니다.
meandf['결측치제거후'] = temp2.groupby(['년', '월'])['미세먼지(㎍/㎥)'].mean()
meandf['차이'] = meandf['미세먼지(㎍/㎥)'] - meandf['결측치제거후']
2017년 6월까지 출력 (생략한 것임)
# [3-37] meandf에서 2017년 6월까지의 데이터만 출력합니다.
# 여러 개의 값에 차이가 있는 것을 확인 할 수 있습니다.
meandf.loc[:(2017,6),:]
미세먼지(㎍/㎥) 결측치제거후 차이
년 월
2016 1 52.693844 52.693844 0.000000
2 48.283273 48.283273 0.000000
3 66.799503 66.799503 0.000000
4 73.327039 73.327039 0.000000
5 58.624172 58.571784 0.052388
6 47.872304 47.872304 0.000000