ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Chapter 06 누락값 처리하기_1
    Do it! 판다스 입문 2022. 6. 21. 17:13

    누락값과 누락값 확인하기

    누락값(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

     

     

     

     

     

     

    출처 : "판다스 입문"

Designed by Tistory.