2013-07-08 2 views
50

팬더 readcsv()을 사용하여 CSV 파일의 두 열을 읽은 다음 해당 값을 사전에 지정합니다. 열은 숫자와 문자의 문자열을 포함합니다. 때때로 셀이 비어있는 경우가 있습니다. 제 생각에는 그 사전 항목으로 읽은 값은 None이되어야하지만 대신 nan이 할당되어야합니다. 분명히 None은 null 값을 가지고 있기 때문에 빈 셀을 더 잘 설명하지만, nan은 단지 읽은 값이 숫자가 아니라고 말합니다.NaN과 None의 차이점은 무엇입니까?

내 이해가 정확합니까? Nonenan의 차이점은 무엇입니까? None 대신 nan이 할당 된 이유는 무엇입니까?

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

을하지만이 내게 v이 수표를 사용할 수 없다는 오류를 제공합니다 :

또한, 빈 세포 내 사전 검사 numpy.isnan()을 사용하고있다. 정수 또는 부동 변수가 아니라 문자열이 사용되기 때문입니다. 그렇다면 v의 "빈 셀"/ nan 사례를 확인하려면 어떻게해야합니까?

+0

텍스트 'qwerty'는 숫자가 아닙니다. –

+1

@RobertHarvey 알다시피, 확실히 '없음'은 빈 셀의 가치에 대한 더 나은 설명이 될 것입니다. – user1083734

+0

@ user1083734 내 대답은 – Stephan

답변

49

missing data consistently in pandas의 자리 표시 자로 NaN이 사용되고 일관성이 좋습니다. 저는 보통 "누락"으로 NaN을 읽고 번역합니다. 문서의 'working with missing data' 섹션을 참조하십시오. 적어도 내 의견으로는, 입증 NumPy와 파이썬에서 업무의 상태에서 주어진 최선의 결정으로 생산 사용 [NaN이]의 년 후에

:

웨스는 문서 'choice of NA-representation'의 글 일반. 특수 값 NaN (Not-A-Number)은 NA 값으로 모든 곳에서으로 사용되며 NA 값을 탐지하기 위해 dtyp에서 사용할 수있는 isnullnotnull API 함수가 있습니다.
...
따라서 파이썬의 "실용성이 순도를 뛰어 넘음"접근 방식을 선택하고 부동 소수점 및 객체 배열에서 특수 값을 사용하여 NA를 나타내거나 정수 배열을 부동으로 승격시키는 훨씬 간단한 방법 NAs가 도입되어야 할 때.

참고 : "gotcha" that integer Series containing missing data are upcast to floats. 내 의견 (없음 이상) NaN의를 사용하는 주된 이유에서

는, NumPy와의 float64의 DTYPE에 저장 될 수있다 오히려 덜 효율적인 객체 DTYPE보다 NA type promotions를 볼 수 있다는 것입니다. 이에

# 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') 

제프 코멘트 (아래) :

np.nan은 벡터화 작업 할 수 있습니다; 부동 소수점 값인 None은 기본적으로 객체 유형을 강제로 지정하므로 기본적으로 numpy에서 모든 효율성을 사용할 수 없습니다.

그래서 반복 3 배 빠른 : 객체 == 나쁜, 그러나 아마 있습니다 (== 좋은

이 많은 작업은 여전히 ​​NaN의 대 없음과 마찬가지로 잘 작동 할 수 있음을 말하는 떠 그들은 때로는 surprising results를 제공 할 수 있습니다 즉,하지) 지원 :

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

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

두 번째 질문에 대답하기 :
누락 된 데이터 (NaN)를 테스트하려면 pd.isnullpd.notnull을 사용해야합니다.

+9

2c를 여기에 추가하면 .... "'np.nan''은 벡터화 된 연산을 허용합니다; 그 float 값은 정의에 의해''None''이''object'' 타입을 강요하고 기본적으로 numpy의 모든 효율을 불가능하게하므로 3 번 빠르게 반복합니다 :''object == bad, float == good'' – Jeff

+0

또한 : http://stackoverflow.com/a/19866269/1240268 –

-2

NaN에 대한 상수는이 아닙니다.
None을 의미합니다.을 의미 할 수 있습니다.

2

isnan() 검사가 뭔가 "숫자가 아닌"인지 확인하고 변수가 숫자인지 여부를 반환합니다 기능, 예를 isnan(2)의 변수가 있는지 여부를 거짓

조건부 myVar is not None 수익률을 반환

을 정의

이 숫자의 배열로 구성되어 있기 때문에 귀하의 NumPy와 배열은 isnan()를 사용하며, 이러한 요소가 "빈"으로 간주됩니다 NaN에 배열의 모든 요소를 ​​초기화

+1

입니다. 2가 NaN이 아니므로'isnan (2)'은'False'를 반환한다고 생각합니다. – heltonbiker

+0

또한,'numpy.empty'는 배열 값을'NaN'으로 초기화하지 않습니다. 단순히 값을 초기화하지 않습니다. – heltonbiker

+0

@heltonbiker idk 내가 생각했던 것 – Stephan

7

NaN은 수학적 연산에서 숫자 값으로 사용될 수 있지만 None은 (또는 적어도 그렇게해서는 안됩니다).

NaNIEEE 754 floating-point standard에 정의 된대로 숫자 값입니다. None은 내부 파이썬 팁 (NoneType)이며이 문맥에서 "숫자 유효하지 않은"것보다 "존재하지 않는"또는 "비어있는"것 같습니다.

주요 "증상"그 당신이 수행하는 경우, 말, 심지어 하나 이상의 NaN을 포함한 배열에 평균 또는 합, 당신은

에서 ... 결과로 NaN이를 얻을 수 있다는 것입니다 반면에 피연산자로 None을 사용하면 수학 연산을 수행 할 수 없습니다.

따라서 케이스에 따라을 알고리즘에 계산에 유효하지 않거나 존재하지 않는 값을 고려하지 않도록 알릴 수 있습니다. 이는 알고리즘이 None인지 확인하기 위해 각 값을 테스트해야 함을 의미합니다.

Numpy에는 NaN 값이 결과를 오염시키지 않도록하는 몇 가지 기능이 있습니다 (예 : nansumnan_to_num).

+0

존재하지 않는 항목에 None을 사용해야한다는 데 동의합니다. 그렇다면'df = pd.readcsv ('file.csv')는 왜 빈 셀에 대해'None '이 아닌'NaN' 값을 제공합니까? 내가 아는 한, pd.DataFrames는 숫자에 대해 독점적이지 않습니다. – user1083734

+0

음, 아마도 디자인 선택 일 겁니다. 나는 DataFrames와 Series가'dtype'을 가지고 있다고 가정하기 때문에'dtype = float'의 유효하지 않은 값은 NaN과 None이 아닌 숫자 값으로 표현되어야합니다 (None은 NoneType입니다). – heltonbiker

+0

또한 팬더의 많은 메서드에는 사용할 수없는 값을 바꾸는 데 사용할 값을 결정할 수있는 'na'인수가 있습니다. – heltonbiker

관련 문제