• 카테고리

    질문 & 답변
  • 세부 분야

    딥러닝 · 머신러닝

  • 해결 여부

    미해결

drop의 inplace =True 값 적용하면 None이 나오는 이유?

20.01.16 17:27 작성 조회수 2.3k

0

안녕하세요.  인플레이스 적용후 반환값이 None이 나오는지 이해가 안되네요 ㅠㅠ 저는 데이터프레임 형태로 다시 나올줄 알았거든요.

none이 되는 이유 설명해주실 수 있나요??

그리고 None 에 대해 잘 모르겠습니다.

답변 1

답변을 작성해보세요.

0

안녕하십니까,

질문해 주신 부분은 실제 코드 작성할때 많이 헷갈리는 부분입니다. 늘 의식을 하고 코드를 작성해야 합니다.

returned_df = org_df.drop(.., inplace=False) 와 같이 DataFrame의 주요 메소드들은 인자로 inplace를 가지며 default는 False 입니다.

잘 아시다시피 returned_df = org_df.drop(.., inplace=False) 와 같이 inplace=False이면 원본 DataFrame은 직접적으로 drop 변경하지 않으며 원본 DataFrame에서 데이터가 drop 된 새로운 DataFrame을 returned_df로 반환합니다. 즉 org_df를 copy 한 뒤 여기서 데이터를 Drop한 새로운 DataFrame이 메모리에 생성되고 returned_df는 이 DataFrame을 가지게 됩니다.  이렇게 하면 returned_df와 org_df 가 모두 메모리 상에 존재하게 되고 많은 메모리를 사용하게 됩니다.

Pandas는 데이터를 무조건 메모리에 올려야 합니다. 메모리가 꽉차면 더이상 메모리에 올릴 수 없습니다.

제 생각에 inplace=True는 이러한 부분을 감안하여 설계된 것 같습니다.

org_df.drop(.., inplace=True) 이면 메모리를 Copy하여 삭제하지 않고 원본 DataFrame의 메모리에 그대로 적용이 됩니다.  그리고 반환은 None을 합니다. None은 쉽게 얘기하면 아무런 값이 아니다는 것입니다. 메모리를 차지하지 않고 자바나 다른 언어의 Null과 마찬가지 입니다.  따라서 inplace=True를 설정할 때는 returned_df = org_df.drop(.., inplace=True)와 같은 식으로 코드를 작성하는 것은 회피해야 합니다. 반환된 returned_df는 None 이기 때문입니다. 

보통 코드 작성 시에는 가급적이면 inplace=False를 사용하는 것이 오히려 실수를 줄일 수 있습니다. returned_df = org_df.drop(.., inplace=False)와 같은 코드가 훨씬 더 직관적이고, 실수로 원본 DataFrame의 데이터를 잘못 삭제했을 경우도 대비할 수 있기 때문입니다.

또한 원본 데이터에 바로 적용할 때도 org_df = org_df.drop(.., inplace=False) 을 적용하면 됩니다. 이때는 반환된 org_df가 다시 새로운 DataFrame을 가리키기 때문에 원본 데이터에 바로 적용됩니다. 물론 과거에 org_df가 참조한 메모리는 더이상 아무도 참조하지 않기 때문에 파이썬의 메모리 가비지 콜렉터가 수행될 때까지는 여전히 메모리에 남아 있다는 단점이 있습니다만,  어느정도 메모리에 영향을 미치지 않는 적당한 크기의 DataFrame이라면 큰 문제가 생길 수 없습니다.

감사합니다.