2017-02-24 9 views
1

에 .loc와 값 :덮어 쓰기 할머니는 내가 다음 코드 라인에 필요한 작업을 해결하기 위해 노력 팬더

df['Age'][np.isnan(df["Age"])] = rand1

enter image description here

그러나 이것은 "SettingWithCopyWarning"을 제기하고 나는 위치를 생각한다 .loc 기능을 사용하여 데이터 프레임의 Nan 값 (열 'Age')을 사용하면 더 좋은 방법 일 수 있습니다.

나는 이미 documentation을 살펴 봤지만 어떻게이 문제를 해결할 수 있는지 알지 못합니다. .loc으로 해결 방법을 찾을 수 없습니다.

나는 모든 힌트와 조언을 부탁드립니다.

df.Age = df.Age.fillna(rand1) 

솔루션을 loc으로 :

df.loc[np.isnan(df["Age"]), 'Age'] = rand1 
#same as 
#df.loc[df["Age"].isnull(), 'Age'] = rand1 

또한 indexing view versus copy을 확인할 수있는 몇 가지 값으로 NaN을 대체하기위한

답변

1

당신은 fillna이 필요합니다.

샘플 :

df = pd.DataFrame({'Age':[20,23,np.nan]}) 
print (df) 
    Age 
0 20.0 
1 23.0 
2 NaN 

rand1 = 30 
df.Age = df.Age.fillna(rand1) 
print (df) 
    Age 
0 20.0 
1 23.0 
2 30.0 

#if need cast to int 
df.Age = df.Age.fillna(rand1).astype(int) 
print (df) 
    Age 
0 20 
1 23 
2 30 
+0

도와 주셔서 감사합니다 많이. 코드는 완벽하게 작동합니다. .loc 함수 내부에서 무슨 일이 일어나는지 설명해 주시겠습니까? 처음에는 나이와 같은 색인에 액세스하기위한 것이라고 생각했습니다. 왜 우리는 .isnan 부분을 통과 한 다음 다시 Age 칼럼을 통과합니까? 문서를 읽은 후에도 이것을 이해하는 데 정말로 어려움이 있습니다. – ErnieandBert

+0

'np.isnan (df [ 'Age'])'는 불리언 값의 마스크를 반환하고'loc'와의 조합으로 값을'True' 값으로'rand1'으로 설정했기 때문에 작동합니다. 나는 더 나은 설명이이 [판다 튜토리얼] (http://tomaugspurger.github.io/modern-1.html)에있다라고 생각한다 - 제목'SettingWithCopy'를 검사한다 (다른 마스크'f [ 'a'] <= 3'를 사용한다. – jezrael

+0

그리고이 튜토리얼은 [여기] (http://pandas.pydata.org/pandas-docs/stable/tutorials.html)입니다 -'현대 팬더'(아주 좋은 설명) – jezrael