• 카테고리

    질문 & 답변
  • 세부 분야

    딥러닝 · 머신러닝

  • 해결 여부

    해결됨

fillna() 질문

20.09.17 21:00 작성 조회수 155

0

안녕하세요.

fillna() 으로 null값 처리할 때 단순한 의문이 생겨서 질문드립니다.

fillna에서 inplace=True 하면 기본 데이터세트가 업데이트되는 것은 이해하였는데요!

아래그림처럼 기존의 ['Age'] 컬럼에 fillna를 적용한 식을 넣어준다는 식으로 표현하면

그 다음에 ['Age'] 컬럼을 확인해보면 none값으로 나오네요..

무슨 차이가 있나요??

답변 1

답변을 작성해보세요.

3

안녕하십니까,

판다스 API중에 데이터를 Drop하거나 값을 채우는 API 들은 inplace라는 인자를 가지는 경우가 많습니다. 그런데 이 inplace를 사용할 때는 유의할 필요가 있습니다. 바로 return 값입니다.

inplace는 호출하는 DataFrame에 변경값을 그대로 적용할 것인지를 나타내는데, False를 적용하면 호출하는 DataFrame에 적용하지 않고 반환값에 적용을 합니다. True를 하게 되면 호출하는 DataFrame에 바로 적용을 하되 return값은 None을 return합니다. 여기에 유의해야 합니다. 

예를 들어 titanic_df['Age'].fillna(titanic_df['Age'].mean, inplace=True)를 하게 되면 titanic_df['Age']에 바로 age 평균값으로 Null을 채우고 return은 None을 하게 됩니다. 그런데 만일 아래와 같이 return 값을 다시 titanic_df['Age']로 받아버리게 되면,  결국은 titanic_df에 바로 age 평균값으로 Null을 채우고 None return값을 titanic_df['Age']로 업데이트 하므로 결국은 None이 됩니다.

titanic_df['Age'] = titanic_df['Age'].fillna(titanic_df['Age'].mean, inplace=True)

따라서 inplace를 True로 할때는 반드시 return값으로 DataFrame을 할당하지 않아야 합니다.

즉 titanic_df['Age'].fillna(titanic_df['Age'].mean, inplace=True) 만 호출이 되어야 합니다.

반대로 inplace를 False로 할때는 반드시 return값으로 DataFrame을 할당해야 합니다.

즉 titanic_df['Age'] = titanic_df['Age'].fillna(titanic_df['Age'].mean, inplace=False)

inplace를 사용하는 API는 이 규칙을 기계적으로 암기하시는게 좋습니다.

감사합니다.