2017-12-13 19 views
3

이 질문에 대한 답변이 an answer에 있습니다.왜 max()가 때때로 nan을 반환하고 가끔 무시합니까?

,의 내가이

import numpy as np 
import pandas as pd 

df = pd.DataFrame({'a': [1, 2, np.nan], 'b': [3, np.nan, 10], 'c':[np.nan, 5, 34]}) 

    a  b  c 
0 1.0 3.0 NaN 
1 2.0 NaN 5.0 
2 NaN 10.0 34.0 

같은 dataframe이 내가 행의 최대로 NaN를 교체하고 싶은 말은 나에게 원하는 출력을 제공 I can do

df.apply(lambda row: row.fillna(row.max()), axis=1) 

하자

그러나을 사용하면
df.apply(lambda row: row.fillna(max(row)), axis=1) 

어떤 이유로이 두 세 가지의 경우에 올바르게 교체 :

 a  b  c 
0 1.0 3.0 3.0 
1 2.0 5.0 5.0 
2 NaN 10.0 34.0 

사실, 내가 손으로 확인하는 경우

max(df.iloc[0, :]) 
max(df.iloc[1, :]) 
max(df.iloc[2, :]) 

그런 다음

3.0 
5.0 
nan 
를 인쇄

할 때

df.iloc[0, :].max() 
df.iloc[1, :].max() 
df.iloc[2, :].max() 

(10)은이

을 예상 인쇄합니다
3.0 
5.0 
34.0 

max()이 삼가지 경우 1 실패를 제외한 모든 3에 왜 때로는 때로는 무시 NaN 등을하지 아니 왜 내 질문은?

+0

유일하게 염두에 두어야 할 점은 3 행의 '나노'가 첫 번째 항목이고 다른 행의 항목이 나중에 나오는 것입니다. 그래서 아마'max'가이 값들을 처리하는 순서에 달려 있습니다 ... –

+0

입니다. 방금 확인한 바,이 동작을 위해 팬더가 필요 없어도'max ([1,2, np.nan]) '및'max ([np.nan, 2,3])'를 입력하면됩니다. –

답변

5

그 이유는 지금까지 본 최대보다 큰 있는지 확인하기 위해 서로 값을 확인 후 "최대 지금까지 본 '로 첫 번째 값을 복용하고 의한 max 작품이다. 그러나 nan은 항상 그 값과의 비교가 False를 반환하도록 정의됩니다. 즉, nan > 1은 false이지만 1 > nan도 false입니다.

배열의 첫 번째 값으로 nan으로 시작하면 이후의 모든 비교는 some_other_value > nan인지 확인합니다. 이 경우 항상 false가되므로 nan은 "지금까지 본 최대"로 위치를 유지합니다. 반면에 nan이 첫 번째 값이 아닐 경우 비교 nan > max_so_far은 다시 false가됩니다. 그러나이 경우 현재까지 "최대로 본 것"(nan이 아님)이 지금까지 본 최대 값을 유지하므로 항상 낭이 삭제됩니다.

+0

감사합니다. – Cleb

6

첫 번째 경우는를 처리하는 방법을 알고있는 numpy max 함수를 사용하고 있습니다.

두 번째 경우에는 파이썬에서 내장 된 max 함수를 사용하고 있습니다. 이것은 numpy.nan을 처리하는 방법을 알지 못합니다. 아마도이 효과는 플로트가 포함 된 numpy.nan의 비교 (>, <, == 등)가 False로 연결되기 때문일 수 있습니다. max을 구현하는 분명한 방법은 iterable (이 경우 행)을 반복하고 각 값이 이전 값보다 큰지 확인한 후 최대 값으로 저장하는 것입니다. 비교 된 값 중 하나가 numpy.nan 일 때 비교 값보다 큰 값이 항상 거짓이므로 기록 된 최대 값이 원하는 값인지 또는 numpy.nan 값이 첫 번째 값이 numpy.nan인지 여부에 전적으로 달려 있는지 여부를 결정합니다.

+1

매우 명확한 설명, 감사합니다. – Cleb

0

두 가지가 다릅니다. max()와 df.max().

max() : python 기본 제공 함수이며 비어 있지 않은 반복 가능이어야합니다. 여기에서 확인하십시오 : https://docs.python.org/2/library/functions.html#max

반면에 skipna라는 매개 변수가 있으며 기본값은 True입니다. 즉, NA/null 값이 제외됩니다.여기 확인 : https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.max.html

+0

이렇게하면 왜 항상'nan'이 반환되지 않는지를 설명 할 수 없지만 다른 답변에서는 잘 설명되어 있습니다 ... – Cleb

1

이것은 목록에있는 요소의 순서 때문입니다. 먼저

max([np.nan, 2, 3]) 

np.nan를 제공하는 동안, 당신은

max([1, 2, np.nan]) 

결과는 2입니다 입력하면, 오프. 우리는 nan에 비교할 때 우리가 무엇을 얻을 보면 지금

if a > b 

모두 np.nan > 21 > np.nan 모두 : 그 이유는 max 기능이 같은 비교에 의해 목록 하나의 값을 통과한다는 것입니다 False을 입력하십시오. 따라서 하나의 경우 실행중인 최대 값은 nan으로 바뀌고 다른 하나는 그렇지 않습니다.

+0

감사합니다. 매우 명확한 설명. – Cleb