-
Chapter 06 누락값 처리하기_1Do 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 == '')
False3. 과정 2에서도 언급했듯이 누락값은 값 자체가 없기 때문에 자기 자신과 비교해도 True가 아닌 False가 출력됩니다.
print(NaN == NaN)
False
print(NaN == nan)
False
print(NaN == NAN)
False
print(nan == NAN)
False4. 그러면 누락값은 어떻게 확인할 수 있을까요? 다행히 판다스에는 누락값을 확인하는 메서드인 isnull이 있습니다. 다음은 isnull 메서드로 누락값을 검사한 예입니다.
import pandas as pd
print(pd.isnull(NaN))
True
print(pd.isnull(nan))
Ture
print(pd.isnull(NAN))
True5. 반대의 경우(누락값이 아닌 경우)도 검사할 수 있습니다. 다음은 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.252. 과정 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.253. 데이터를 입력할 때 누락값이 생기는 경우
누락값은 데이터를 잘못 입력하여 생길 수도 있습니다. 다음은 시리즈를 생성할 때 데이터 프레임에 없는 열과 행 데이터를 입력하여 누락값이 생긴 것입니다. 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: float646. 다음은 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출처 : "판다스 입문"
'Do it! 판다스 입문' 카테고리의 다른 글
Chapter 07-1~07-2 열과 피벗, 열 이름 관리하기 (0) 2022.06.22 Chapter 06 누락값 처리하기_2 (0) 2022.06.21 Chapter 05 데이터 연결하기 (0) 2022.06.21 Chapter 04-4~04-5 데이터프레임과 시리즈로 그래프 그리기, seaborn 라이브러리로 그래프 스타일 설정하기 (0) 2022.06.20 Chapter 04-3 seaborn 라이브러리 자유자재로 사용하기 (0) 2022.06.20