Chapter 06 누락값 처리하기_1
누락값과 누락값 확인하기
누락값(NaN)은 NaN, NAN, nan과 같은 방법으로 표기할 수 있습니다. 이 책에서는 누락값을 NaN이라고 표기하여 사용합니다. 그러면 바로 실습을 진행해 보면서 누락값이 무엇인지 알아보겠습니다.
누락값 확인하기
1. 먼저 누락값을 사용하기 위해 numpy에서 누락값을 불러옵니다.
from numpy import NaN, NAN, nan |
2. 누락값은 0, ' '와 같은 값과는 다른 개념이라는 것에 주의해야 합니다. 누락값은 말 그대로 데이터 자체가 없다는 것을 의미합니다. 그래서 '같다'라는 개념도 없죠. 다음은 누락값과 True, False, 0, ' '을 비교한 결과입니다.
print(NaN == True) False print(NaN == False) False print(NaN == 0) False print(NaN == '') False |
3. 과정 2에서도 언급했듯이 누락값은 값 자체가 없기 때문에 자기 자신과 비교해도 True가 아닌 False가 출력됩니다.
print(NaN == NaN) False print(NaN == nan) False print(NaN == NAN) False print(nan == NAN) False |
4. 그러면 누락값은 어떻게 확인할 수 있을까요? 다행히 판다스에는 누락값을 확인하는 메서드인 isnull이 있습니다. 다음은 isnull 메서드로 누락값을 검사한 예입니다.
import pandas as pd print(pd.isnull(NaN)) True print(pd.isnull(nan)) Ture print(pd.isnull(NAN)) True |
5. 반대의 경우(누락값이 아닌 경우)도 검사할 수 있습니다. 다음은 notnull 메서드로 누락값이 아닌 경우를 검사한 예입니다.
print(pd.notnull(NAN)) False print(pd.notnull(42)) True print(pd.notnull('missing')) True |
누락값이 생기는 이유
누락값은 왜 생길까요? 누락값은 처음부터 누락값이 있는 데이터를 불러오거나 데이터를 연결, 입력하는 등의 과정에서 생길 수 있습니다. 그러면 다음 예제를 통해 누락값이 생기는 이유에 대해 자세히 알아보겠습니다.
누락값이 생기는 이유 알아보기
1. 누락값이 있는 데이터 집합을 연결할 때 누락값이 생기는 경우
이번에 사용할 데이터 집합은 누락값이 포함되어 있습니다. 누락값이 포함되어 있는 데이터 집합을 연결하면 어떻게 될까요? 누락값이 포함되어 있는 데이터 집합을 연결하면 더 많은 누락값이 생깁니다.
visited = pd.read_csv('../data/survey_visited.csv') survey = pd.read_csv('../data/survey_survey.csv') print(visited) ident site dated 0 619 DR-1 1927-0208 1 622 DR-1 1927-02-10 2 734 DR-3 1939-01-07 3 735 DR-3 1930-01-12 4 751 DR-3 1930-02-26 5 752 DR-3 NaN 6 837 MSK-4 1932-01-14 7 844 DR-1 1932-03-22 print(survey) taken person quant reading 0 619 dyer rad 9.82 1 619 dyer sal 0.13 2 622 dyer rad 7.80 3 622 dyer sal 0.09 4 734 pb rad 8.41 5 734 lake sal 0.05 6 734 pb temp -21.50 7 735 pb rad 7.22 8 735 NaN sal 0.06 9 735 NaN temp -26.00 10 751 pb rad 4.35 11 751 pb temp -18.50 12 751 lake sal 0.10 13 752 lake rad 2.19 14 752 lake sal 0.09 15 752 lake temp -16.00 16 752 roe sal 41.60 17 837 lake rad 1.46 18 837 lake sal 0.21 19 837 roe sal 22.50 20 844 roe rad 11.25 |
2. 과정 1에서 구한 데이터 집합을 연결해 볼까요? 그러면 누락값이 많이 생겨난 것을 볼 수 있습니다.
vs = visited.merge(survey, left_on='ident', right_on='taken') print(vs) ident site dated taken person quant reading 0 619 DR-1 1927-02-08 619 dyer rad 9.82 1 622 DR-1 1927-02-10 619 dyer sal 0.13 ... 13 752 DR-3 NaN 752 lake rad 2.19 14 752 DR-3 NaN 752 lake sal 0.09 15 752 DR-3 NaN 752 lake temp -16.00 16 752 DR-3 NaN 752 roe sal 41.60 17 837 MSK-4 1932-01-14 837 lake rad 1.46 18 837 MSK-4 1932-01-14 837 lake sal 0.21 19 837 MSK-4 1932-01-14 837 roe sal 22.50 20 844 DR-3 1932-03-22 844 roe rad 11.25 |
3. 데이터를 입력할 때 누락값이 생기는 경우
누락값은 데이터를 잘못 입력하여 생길 수도 있습니다. 다음은 시리즈를 생성할 때 데이터 프레임에 없는 열과 행 데이터를 입력하여 누락값이 생긴 것입니다. scientitsts 데이터프레임을 확인하면 missing이라는 열과 함께 행 데이터에 누락값이 추가된 것을 확인할 수 있습니다.
num_legs = pd.Series({'goat': 4, 'amoeba': nan}) print(num_legs) print(type(num_legs)) amoeba NaN goat 4.0 dtype: float64 <class 'pandas.core.series.Series'> scientists = pd.DataFrame({ 'Name': ['Rosaline Franklin', 'William Gosset'], 'Occupation': ['Chemist', 'Statistician'], 'Born': ['1920-07-25', '1876-06-13'], 'Died': ['1958-04-16', '1937-10-16'], 'missing': [NaN, nan]}) print(scientists) print(type(scientists)) Born Died Name Occupation missing 0 1920-07-25 1958-04-16 Rosaline Franklin Chemist NaN 1 1876-06-13 1937-10-16 William Gosset Statistician NaN <class 'pandas.core.frame.DataFrame'> |
4. 범위를 지정하여 데이터를 추출할 때 누락값이 생기는 경우
데이터 프레임에 존재하지 않는 데이터를 추출하면 누락값이 생깁니다. 이번에는 갭마인더 데이터 집합을 불러와 실습해 보겠습니다.
gapminder = pd.read_csv('../data/gapminder.tsv', sep='\t') |
5. 다음은 gapminder 데이터프레임을 연도별로 그룹화한 다음 lifeExp 열의 평균을 구한 것입니다.
life_exp = gapminder.groupby(['year'])['lifeExp'].mean( ) print(life_exp) year 1952 49.057620 1957 513507401 1962 53.609249 ... 1997 65.014676 2002 64.694923 2007 67.007423 Name: lifeExp, dtype: float64 |
6. 다음은 range 메서드를 이용하여 life_Exp 열에서 2000~2009년의 데이터를 추출한 것입니다. 그런데 이렇게 데이터를 추출하면 처음부터 life_Exp 열에 없었던 연도가 포함되기 때문에 누락값이 많이 발생합니다.
print(life_exp.loc[range(2000, 2010), ]) year 2000 NaN 2001 NaN 2002 65.694923 2003 NaN 2004 NaN 2005 NaN 2006 NaN 2007 67.007423 2008 NaN 2009 NaN Name: lifeExp, dtype: float64 (아래의 경고 문구는 누락값으로 인해 문제가 발생할 수도 있다고 미리 알려주는 것입니다.) C:\Users\phk70\Anaconda3\lib\site-packages\ipykernel_launcher.py:1: FutureWarning: Passing list-likes to .loc or [] with any missing label will raise KeyError in the future, you can use .reindex( ) as an alternative. See the documentation here: https://pandas.pydata.org/pandas-docs/stable/indexing/html#deprecate-loc-reindex-listlike """Entry point for launching an IPython kernel. |
7. 앞에서 발생한 문제를 해결하기 위해서는 불린 추출을 이용하여 데이터를 추출하면 됩니다.
y2000 = life_exp[life_exp.index > 2000] print(y2000) year 2002 65.694923 2007 67.007423 Name: lifeExp, dtype: float64 |
출처 : "판다스 입문"