NaN과 None의 차이점은 무엇입니까?


97

팬더를 사용하여 csv 파일의 두 열을 읽은 readcsv()다음 값을 사전에 할당합니다. 열에는 숫자와 문자의 문자열이 포함됩니다. 때때로 셀이 비어있는 경우가 있습니다. 제 생각에는 해당 사전 항목에 읽은 값이 있어야 None하지만 대신 nan할당됩니다. 확실히 None이 널 값이 같은 반면, 빈 셀의 더 자세한 설명입니다 nan단지는 값 읽기 수없는 것을 말한다.

내 올바른 이해되어, 차이점은 무엇인가 None와는 nan? nan대신 할당 된 이유는 무엇 None입니까?

또한 빈 셀에 대한 내 사전 검사는 다음을 사용하고 있습니다 numpy.isnan().

for k, v in my_dict.iteritems():
    if np.isnan(v):

그러나 이것은이 검사를 사용할 수 없다는 오류를 제공합니다 v. 문자열이 아닌 정수 또는 부동 변수가 사용되기 때문이라고 생각합니다. 이것이 사실이라면 어떻게 v"빈 셀"/ nan케이스를 확인할 수 있습니까?


텍스트 qwerty는 숫자가 아닙니다.
Robert Harvey

1
@RobertHarvey 내가 알고 있으므로 None빈 셀의 값에 대한 더 나은 설명이 될 것 입니다.
user1083734

답변:


110

NaN은 pandas 에서 일관 되게 누락 된 데이터에 대한 자리 표시 자로 사용되며 일관성이 좋습니다. 나는 보통 NaN을 "missing" 으로 읽거나 번역 합니다. 또한 문서의 '누락 된 데이터 작업' 섹션을 참조하십시오 .

Wes는 'NA- 표현의 선택' 이라는 문서에 다음과 같이 씁니다 .

수년간의 프로덕션 사용 후 [NaN]은 적어도 제 생각에는 NumPy와 Python의 전반적인 상황을 고려할 때 최상의 결정임을 입증했습니다. 특수한 값이 NaN (Not-A-번호)가 사용되는 모든 곳에서 NA의 값으로, 그리고 API 기능이있다 isnullnotnull이는 NA 값을 검출하기 위해 dtypes에 걸쳐 사용할 수 있습니다.
...
따라서, 저는 파이썬의“실용성이 순도를 이깁니다”접근 방식을 선택하고 정수 NA 기능을 선택하여 부동 소수점 및 객체 배열에서 특수 값을 사용하여 NA를 표시하고 NA가 있어야 할 때 정수 배열을 부동으로 승격시키는 훨씬 더 간단한 접근 방식을 사용했습니다. 도입.

참고 : 누락 된 데이터를 포함하는 정수 시리즈가 부동 소수점으로 업 캐스트된다는 "잘못" .

내 생각에 NaN (None 이상)을 사용하는 주된 이유는 덜 효율적인 객체 dtype이 아닌 numpy의 float64 dtype으로 저장할 수 있다는 것 입니다. NA 유형 프로모션을 참조하십시오 .

#  without forcing dtype it changes None to NaN!
s_bad = pd.Series([1, None], dtype=object)
s_good = pd.Series([1, np.nan])

In [13]: s_bad.dtype
Out[13]: dtype('O')

In [14]: s_good.dtype
Out[14]: dtype('float64')

Jeff는 이에 대해 (아래) 설명합니다.

np.nan벡터화 된 작업을 허용합니다. 그것의 float 값 None은 정의에 따라 객체 유형을 강제 적용하여 기본적으로 numpy의 모든 효율성을 비활성화합니다.

따라서 3 번 빠르게 반복 : object == bad, float == good

즉, 많은 작업이 None 대 NaN에서도 여전히 잘 작동 할 수 있습니다 (그러나 지원되지 않을 수 있습니다. 즉, 때때로 놀라운 결과를 제공 할 수 있음 ).

In [15]: s_bad.sum()
Out[15]: 1

In [16]: s_good.sum()
Out[16]: 1.0

: 두 번째 질문에 대답하려면,
당신은 사용해야 pd.isnullpd.notnull비수 (NaN)에 누락 된 데이터를 테스트 할 수 있습니다.


19
여기에 2c를 추가하기 만하면 .... np.nan벡터화 된 작업이 가능합니다. 그것의 float 값 None은 정의에 따라 강제로 object입력하고 기본적으로 numpy의 모든 효율성을 비활성화하므로 3 번 빠르게 반복합니다.object==bad, float==good
Jeff

1
<NA>np.nan?
Gathide

18

NaN수학적 연산에서 숫자 값으로 None사용할 수 있지만 할 수 없습니다 (또는 적어도해서는 안됩니다).

NaNIEEE 754 부동 소수점 표준에 정의 된 숫자 값 입니다. None내부 Python 유형 ( NoneType)이며이 컨텍스트에서 "숫자가 유효하지 않음"보다 "비 존재"또는 "비어 있음"과 비슷합니다.

그 주된 "증상"은 NaN을 포함하는 배열에서 평균 또는 합계를 수행하는 경우 (단일 하나라도) 결과적으로 NaN을 얻는다는 것입니다.

반면에 None피연산자로 사용하여 수학 연산을 수행 할 수 없습니다 .

따라서 경우에 따라 None계산에서 유효하지 않거나 존재하지 않는 값을 고려하지 않도록 알고리즘에 알리는 방법으로 사용할 수 있습니다 . 이는 알고리즘이 각 값을 테스트하여 None.

Numpy에는 nansumnan_to_num예 와 같이 NaN 값이 결과를 오염시키는 것을 방지하는 몇 가지 기능이 있습니다.


존재하지 않는 항목에는 없음을 사용해야한다는 데 동의합니다. 왜 빈 셀에 대한 값을 df=pd.readcsv('file.csv')제공 NaN하지 None않습니까? 내가 아는 한 pd.DataFrames는 숫자 전용이 아닙니다.
user1083734

글쎄, 아마도 디자인 선택 일 것입니다. 나는 DataFrames을 생각하고 시리즈는이 dtype중, 그래서 잘못된 값을 dtype=float수치로 표시해야 NaN하고 None(아닙니다 None이다 NoneType).
heltonbiker

또한, 팬더 방법을 많이가 있습니다 na당신이하지-가능한 값을 대체하기 위해 사용하려고하는 값을 결정하게 인수
heltonbiker

알았어 고마워. 그래서 나는 실제로 내 DataFrame으로 숫자를 읽는 것이 아니라 숫자와 문자의 문자열을 읽습니다. 빈 셀을 감지하려면 어떤 종류의 검사를 사용해야합니까? 같은 수표; dtype == float : ??
user1083734

CSV 데이터 샘플을 게시하면 도움이 될 것입니다. 문자열이 있으면 dtype이 전체 열 (Series)에 대한 문자열이 될 것이라고 상상할 수 있습니다. 그러나 모든 행에 동일한 수의 열이있는 것은 아니라면 데이터를 사용할 수 없게됩니다. 나는 당신이 그것을 확인해야 할 것이라고 생각합니다.
heltonbiker

3

이 함수 isnan()는 무언가가 "숫자가 아님"인지 확인하고 변수가 숫자인지 여부를 반환합니다. 예를 들어 isnan(2)false를 반환합니다.

조건부 myVar is not None는 변수가 정의되었는지 여부를 반환합니다.

당신의 numpy 배열은 isnan()숫자의 배열을 의도하고 배열의 모든 요소를 NaN이 요소가 "빈"으로 간주 되기 때문에 사용합니다.


1
2는 NaN이 아니기 때문에을 isnan(2)반환 할 것이라고 생각 False합니다.
heltonbiker

또한 numpy.empty배열 값을 NaN. 단순히 값을 전혀 초기화하지 않습니다.
heltonbiker

5
None-ness에 대한 적절한 검사 는 myVar is not None아닙니다 myVar != None.
Jaime

3
np.isnan()당신이 문자열을 전달할 경우 충돌 있도록, 문자열 변수에 대한 구현되지 않습니다. pd.isnull문자열과 함께 작동하는 것을 사용 하는 것이 더 좋습니다 .
Michael

-1

다음은 차이점입니다.

  • nan 수업에 속하다 float
  • None 수업에 속하다 NoneType

아래 기사가 매우 유용하다는 것을 알았습니다 : https://medium.com/analytics-vidhya/dealing-with-missing-values-nan-and-none-in-python-6fc9b8fb4f31


이 링크가 질문에 답할 수 있지만 여기에 답변의 필수 부분을 포함하고 참조 용 링크를 제공하는 것이 좋습니다. 링크 된 페이지가 변경되면 링크 전용 답변이 무효화 될 수 있습니다. - 리뷰에서
A. Kootstra

@ A.Kootstra 이해합니다
eswara amirthan s

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.