-
Chapter 06 누락값 처리하기_2Do it! 판다스 입문 2022. 6. 21. 18:55
누락값의 개수
지금까지 누락값이 생기는 다양한 경우에 대해 알아보았습니다. 이번에는 누락값의 개수를 구하는 방법에 대해 알아보겠습니다.
누락값의 개수 구하기
1. 다음과 같이 입력하여 데이터를 불러옵니다.
ebola = pd.read_csv('../data/country_timeseries.csv') 2. 먼저 count 메서드로 누락값이 아닌 값의 개수를 구해 보겠습니다.
print(ebola.count( ))
Date 122
Day 122
cases_Guinea 93
Cases_Liberia 83
Cases_SierraLeone 87
...
Deaths_Spain 16
Deaths_Mali 12
dtype: int643. 과정 2의 결과만 잘 활용해도 누락값의 개수를 쉽게 구할 수 있습니다. shape[0]에 전체 행의 데이터 개수가 저장되어 있다는 점을 이용하여 shape[0]에서 누락값이 아닌 값의 개수를 빼면 누락값의 개수를 구할 수 있습니다.
num_rows = ebola.shape[0]
num_missing = num_rows - ebola.count( )
print(num_missing)
Date 0
Day 0
Cases_Guinea 29
Cases_Liberia 39
Cases_SierraLeone 35
Cases_Nigeria 84
Cases_Senegal 97
Cases_UnitedStates 104
Cases_Spain 106
Cases_Mali 110
Deaths_Guinea 30
Deaths_Liberia 41
Deaths_SierraLeone 35
Deaths_Nigeria 84
Deaths_Senegal 100
Deaths_UnitedStates 104
Deaths_Spain 106
Deaths_Mali 110
dtypye: int644. count 메서드를 사용해도 되지만 count_nonzero, isnull 메서드를 조합해도 누락값의 개수를 구할 수 있습니다.
import numpy as np
print(np.count_nonzero(ebola.isnull( )))
1214
print(np.count_nonzero(ebola['Cases_Guinea'].isnull( )))
295. 시리즈에 포함된 value_counts 메서드는 지정한 열의 빈도를 구하는 메서드입니다. value_counts 메서드를 사용해 Cases_Guinea 열의 누락값 개수를 구하려면 다음과 같이 입력합니다.
print(ebola.Cases_Guinea.value_counts(dropna=False).head( ))
NaN 29
86.0 3
495.0 2
112.0 2
390.0 2
Name: Cases_Guinea, dtype: int64누락값 처리하기
누락값은 누락값을 임의의 값으로 변경하거나 데이터프레임에 이미 있는 값으로 대신 채우는 방법 등으로 처리할 수 있습니다. 그러면 누락값을 처리하는 방법을 하나씩 알아보겠습니다.
누락값 처리하기 - 변경, 삭제
1. 누락값 변경하기
데이터프레임에 포함된 fillna 메서드에 0을 대입하면 누락값을 0으로 변경합니다. fillna 메서드는 처리해야 하는 데이터프레임의 크기가 매우 크고 메모리를 효율적으로 사용해야 하는 경우에 자주 사용하는 메서드입니다.
print(ebola.fillna(0).iloc[0:10, 0:5])
Date Day Cases_Guinea Cases_Liberia Cases_SierraLeone
0 1/5/2015 289 2776.0 0.0 10030.0
1 1/4/2015 288 2775.0 0.0 9780.0
2 1/3/2015 287 2769.0 8166.0 9722.0
3 1/2/2015 286 0.0 8157.0 0.0
4 12/31/2014 284 2730.0 8115.0 9633.0
5 12/28/2014 281 2706.0 8018.0 9446.0
6 12/27/2014 280 2695.0 0.0 9409.0
7 12/24/2014 277 2630.0 7977.0 9203.0
8 12/21/2014 273 2597.0 0.0 9004.0
9 12/20/2014 272 2571.0 7862.0 8939.02. fillna 메서드의 method 인잣값을 ffill로 지정하면 누락값이 나타나기 전의 값으로 누락값이 변경됩니다. 예를 들어 6행의 누락값은 누락값이 나타나기 전의 값인 5행의 값을 사용하여 누락값을 처리합니다. 하지만 0, 1행은 처음부터 누락값이기 때문에 누락값이 그대로 남아 있습니다.
print(ebola.fillna(method='ffill').iloc[0:10, 0:5])
Date Day Cases_Guinea Cases_Liberia Cases_SierraLeone
0 1/5/2015 289 2776.0 NaN 10030.0
1 1/4/2015 288 2775.0 NaN 9780.0
2 1/3/2015 287 2769.0 8166.0 9722.0
3 1/2/2015 286 2769.0 8157.0 0.0
4 12/31/2014 284 2730.0 8115.0 9633.0
5 12/28/2014 281 2706.0 8018.0 9446.0
6 12/27/2014 280 2695.0 8018.0 9409.0
7 12/24/2014 277 2630.0 7977.0 9203.0
8 12/21/2014 273 2597.0 7977.0 9004.0
9 12/20/2014 272 2571.0 7862.0 8939.03. method 인잣값을 bfill로 지정하면 누락값이 나타난 이후의 첫 번째 값으로 앞쪽의 누락값이 모두 변경됩니다. 즉, 과정 2의 반대 방향으로 누락값을 처리한다고 생각하면 됩니다. 하지만 이 방법도 마지막 값이 누락값인 경우에는 처리하지 못한다는 단점이 있습니다.
print(ebola.fillna(method='bfill').iloc[0:10, 0:5])
Date Day Cases_Guinea Cases_Liberia Cases_SierraLeone
0 1/5/2015 289 2776.0 8166.0 10030.0
1 1/4/2015 288 2775.0 8166.0 9780.0
2 1/3/2015 287 2769.0 8166.0 9722.0
3 1/2/2015 286 2730.0 8157.0 0.0
4 12/31/2014 284 2730.0 8115.0 9633.0
5 12/28/2014 281 2706.0 8018.0 9446.0
6 12/27/2014 280 2695.0 7977.0 9409.0
7 12/24/2014 277 2630.0 7977.0 9203.0
8 12/21/2014 273 2597.0 7862.0 9004.0
9 12/20/2014 272 2571.0 7862.0 8939.04. 과정 2, 3에서는 데이터프레임의 값을 그대로 사용하여 누락값을 처리했습니다. interpolate 메서드는 누락값 양쪽에 있는 값을 이용하여 중간값을 구한 다음 누락값을 처리합니다. 이렇게 하면 데이터프레임이 일정한 간격을 유지하고 있는 것처럼 수정할 수 있습니다.
print(ebola.interpolate( ).iloc[0:10, 0:5])
Date Day Cases_Guinea Cases_Liberia Cases_SierraLeone
0 1/5/2015 289 2776.0 NaN 10030.0
1 1/4/2015 288 2775.0 NaN 9780.0
2 1/3/2015 287 2769.0 8166.0 9722.0
3 1/2/2015 286 2749.5 8157.0 0.0
4 12/31/2014 284 2730.0 8115.0 9633.0
5 12/28/2014 281 2706.0 8018.0 9446.0
6 12/27/2014 280 2695.0 7997.5 9409.0
7 12/24/2014 277 2630.0 7977.0 9203.0
8 12/21/2014 273 2597.0 7919.5 9004.0
9 12/20/2014 272 2571.0 7862.0 8939.05. 누락값 삭제하기
누락값이 필요 없을 경우에는 누락값을 삭제해도 됩니다. 하지만 누락값을 무작정 삭제하면 데이터가 너무 편향되거나 데이터의 개수가 너무 적어질 수도 있습니다. 그래서 누락값을 삭제할 때는 분석하는 사람이 잘 판단해야 합니다. 먼저 ebola의 데이터 구조를 확인해 보겠습니다.
print(ebola.shape)
(122, 18)6. 누락값을 삭제하기 위해 dropna 메서드를 사용하겠습니다. 누락값이 포함된 행들이 모두 삭제되기 때문에 많은 데이터가 삭제되었습니다.
ebola_dropna = ebola.dropna( )
print(ebola_dropna.shape)
(1, 18)
print(ebola_drpna)
Date Day Cases_Guinea Cases_Liberia Cases_SierraLeone \
19 11/18/2014 241 2047.0 7082.0 6190.0
Cases_Nigeria Cases_Senegal Cases_UnitedStates Cases_Spain Cases_Mali \
19 20.0 1.0 4.0 1.0 6.0
Deaths_Guinea Deaths_Liberia Deaths_SierraLeone Deaths_Nigeria \
19 1214.0 2963.0 1267.0 8.0
Deaths_Senegal Deaths_UnitedStates Deaths_Spain Deaths_Mali
19 0.0 1.0 0.0 6.0누락값이 포함된 데이터 계산하기
만약 누락값이 포함된 데이터를 계산하려면 어떻게 해야 할까요? 다음은 여러 지역에서 발생한 ebola 발병 수를 구하는 실습입니다. ebola 데이터프레임에는 누락값이 많습니다.
이 점을 염두에 두고 다음 실습을 진행해 보세요
누락값이 포함된 데이터 계산하기
1. Guinea, Liberia, SierraLeone 열에는 누락값들이 존재합니다. 만약 누락값이 존재하는 Guinea, Liberia, SierraLeone 열을 가지고 ebola 발병 수의 합을 계산하면 어떻게 될까요? 다음은 Cases_Guinea, Cases_Liberia, Cases_SierraLeone열을 더하여 Cases_multiple 열을 새로 만든 것입니다.
ebola['Cases_multiple'] = ebola['Cases_Guinea'] + ebola['Cases_Liberia'] + ebola['Cases_SierraLeone'] 2. 과정 1에서 계산한 Cases_multiple 열을 포함하여 ebola_subset이라는 데이터프레임을 새로 만들어서 어떤 값이 존재하는지 확인해 보겠습니다. Cases_Guinea, Cases_Liberia, Cases_SierraLeone에서 누락값이 하나라도 있는 행은 계산 결과(Cases_multiple)가 NaN이 되었음을 알 수 있습니다. 즉, 계산 결과 누락값이 더 많이 생겼습니다.
ebola_subset = ebola.loc[:, ['Cases_Guinea', 'Cases_Liberia', 'Cases_SierraLeone', 'Cases_multiple']]
print(ebola_subset.head(n=10))
Cases_Guinea Cases_Liberia Cases_SierraLeone Cases_multiple
0 2776.0 NaN 10030.0 NaN
1 2775.0 NaN 9780.0 NaN
2 2769.0 8166.0 9722.0 20657.0
3 NaN 8157.0 NaN NaN
4 2730.0 8115.0 9633.0 20478.0
5 2706.0 8018.0 9446.0 20170.0
...
8 2597.0 NaN 9004.0 NaN
9 2571.0 7862.0 8939.0 19372.03. Cases_multiple 열을 sum 메서드를 사용해 더하면 세 지역의 ebola 발병 수의 합을 구할 수 있습니다. 이때 sum 메서드를 그냥 사용하면 누락값을 포함해 계산합니다. 따라서 결괏값도 누락값이 됩니다. 누락값을 무시한 채 계산하려면 skipna 인잣값을 True로 설정하면 됩니다.
print(ebola.Cases_Guinea.sum(skipna = True))
84729.0
print(ebola.Cases_Guinea.sum(skipna = False))
NaN마무리하며
데이터 분석 분야에서는 누락값을 처리하는 능력이 매우 중요합니다. 데이터를 통해 의사 결정이나 추론을 하려면 반드시 필요한 능력이죠. 이 장에서는 누락값을 처리하는 여러 가지 방법을 알아보았습니다. 누락값은 언제 어디서든 생길 수 있기 때문에 누락값을 처리하는 방법은 반드시 알아두어야 합니다.
출처 : "판다스 입문"
'Do it! 판다스 입문' 카테고리의 다른 글
Chapter 07-3~5 여러 열을 하나로 정리하기, 중복 데이터 처리하기, 대용량 데이터 처리하기 (0) 2022.06.22 Chapter 07-1~07-2 열과 피벗, 열 이름 관리하기 (0) 2022.06.22 Chapter 06 누락값 처리하기_1 (0) 2022.06.21 Chapter 05 데이터 연결하기 (0) 2022.06.21 Chapter 04-4~04-5 데이터프레임과 시리즈로 그래프 그리기, seaborn 라이브러리로 그래프 스타일 설정하기 (0) 2022.06.20