판다에서, 제자리에서 = 참이 해롭다고 생각합니까, 아니면 아닌가요?
이에 대해 이전에 논의했지만, 다음과 같은 상반된 대답은 다음과 같습니다.
제가 궁금한 것은:
- 이유는
inplace = False
기본 동작? - 언제 변경하는 것이 좋습니까?(글쎄요, 제가 바꿀 수 있으니까 이유가 있는 것 같네요.)
- 이것은 안전 문제입니까?즉, 작업 실패/잘못으로 인해
inplace = True
? - 확실하다면 미리 알 수 있을까요?
inplace = True
운영이 "정말" 제자리에서 수행됩니까?
지금까지의 내 생각은:
- 많은 판다들의 운영은
inplace
매개 변수, 항상 기본값False
즉, 원래 DataFrame이 변경되지 않고 작업이 새 DF를 반환합니다. - 설정 시
inplace = True
작업이 원래 DF에서 작동할 수도 있지만, 백그라운드에서 복사본에서 작동할 수도 있고, 완료되면 참조를 재할당할 수도 있습니다.
의 찬성.inplace = True
:
- 더 빠르고 더 적은 메모리 호깅이 가능합니다(첫 번째 링크에 표시됨).
reset_index()
두 배 더 빠르게 실행되고 피크 메모리의 절반을 사용합니다!).
의 찬성.inplace = False
:
- 연결/기능 구문 허용:
df.dropna().rename().sum()...
이것은 좋고, 게으른 평가나 더 효율적인 재주문을 할 수 있는 기회를 제공합니다(판다스가 이것을 하고 있다고 생각하지 않지만). - 사용 시
inplace = True
잠재적으로 기본 DF의 슬라이스/뷰인 물체에 대해 Pandas는SettingWithCopy
수표, 그것은 비쌉니다.inplace = False
이를 피합니다. - 배후에서 일관되고 예측 가능한 행동.
따라서 복사-vs-view 문제는 제쳐두고 항상 사용하는 것이 더 성능이 좋은 것 같습니다.inplace = True
특별히 연쇄 진술서를 작성하지 않는 한.하지만 그것은 판다가 선택하는 기본값이 아닙니다. 그래서 제가 놓치고 있는 것은 무엇일까요?
판다에서, 제자리에서 = 참이 해롭다고 생각합니까, 아니면 아닌가요?
네.해롭기만 한 게 아닙니다.상당히 해롭습니다.이 GitHub 문제는 다음을 제안합니다.inplace
가까운 장래에 API 전체에서 인수가 사용되지 않습니다.간단히 말해서, 여기 모든 문제가 있습니다.inplace
인수:
inplace
이름이 의미하는 바와 달리, 종종 복사본이 생성되는 것을 막지 않으며 (계속) 성능 이점을 제공하지 않습니다.inplace
메서드 체인과 함께 작동하지 않습니다.inplace
공포로 이어질 수 있습니다.SettingWithCopyWarning
DataFrame 열에서 호출되는 경우, 때때로 열을 업데이트하지 못할 수 있습니다.
위의 문제점들은 모두 초보자들에게 흔한 함정들이기 때문에, 이 옵션을 제거하면 API가 크게 간소화될 것입니다.
우리는 위의 요점들을 더 자세히 살펴봅니다.
실적|실적|
를 사용하는 것은 일반적인 오해입니다.inplace=True
보다 효율적이거나 최적화된 코드로 이어집니다.일반적으로 사용 시 성능상의 이점은 없습니다.inplace=True
(그러나 라이브러리에서 구현 세부사항의 결과이며 이 인수의 사용을 옹호하는 목발로 사용해서는 안 되는 드문 예외가 있습니다.)대부분의 인플레이스 버전과 아웃플레이스 버전의 메소드는 데이터의 복사본을 생성하고 인플레이스 버전은 자동으로 복사본을 다시 할당합니다.복사를 피할 수 없습니다.
Method
inplace=True
또한 메서드 체인을 방해합니다.의 작업을 비교합니다.
result = df.some_function1().reset_index().some_function2()
와는 반대로
temp = df.some_function1()
temp.reset_index(inplace=True)
result = temp.some_function2()
하지 않은
명심해야 할 마지막 주의 사항은 전화를 걸렸다는 것입니다.inplace=True
트리거할 수 있습니다.
df = pd.DataFrame({'a': [3, 2, 1], 'b': ['x', 'y', 'z']})
df2 = df[df['a'] > 1]
df2['b'].replace({'x': 'abc'}, inplace=True)
# SettingWithCopyWarning:
# A value is trying to be set on a copy of a slice from a DataFrame
예기치 않은 동작이 발생할 수 있습니다.
한다면inplace
이 기본값으로 설정된 경우 현재 참조하고 있는 모든 이름에 대해 데이터 프레임이 변환됩니다.
간단한 예를 들어, 제가 가지고 있다고 가정해 보겠습니다.df
:
df = pd.DataFrame({'a': [3, 2, 1], 'b': ['x', 'y', 'z']})
DataFrame이 행 순서를 유지하는 것이 매우 중요합니다. 예를 들어 삽입 순서가 핵심인 데이터 소스에서 가져온 것이라고 가정해 보겠습니다.
그러나 이제 다른 정렬 순서가 필요한 몇 가지 작업을 수행해야 합니다.
def f(frame):
df = frame.sort_values('a')
# if we did frame.sort_values('a', inplace=True) here without
# making it explicit - our caller is going to wonder what happened
# do something
return df
괜습니다다 - 제원니입본.df
그대로 유지됩니다. 만약 만지면, 에약.inplace=True
내 원래의 것이 기본값이었습니다.df
는 이제 부용정렬다의 입니다.f()
전화를 건 사람이 일부러 제자리에서 무언가를 하는 대신에 내가 예상하지 못한 장소에서 무언가를 하지 않는 것을 기억하도록 믿어야 하는 것.따라서 어떤 물체를 제자리에서 변형시킬 수 있는 것은 적어도 무슨 일이 일어났고 왜 일어났는지를 더 명확하게 하기 위해 그렇게 명시적으로 하는 것이 좋습니다.
기본 Python에 내장된 변수를 사용하더라도 다음을 관찰할 수 있습니다.
data = [3, 2, 1]
def f(lst):
lst.sort()
# I meant lst = sorted(lst)
for item in lst:
print(item)
f(data)
for item in data:
print(item)
# huh!? What happened to my data - why's it not 3, 2, 1?
언급URL : https://stackoverflow.com/questions/45570984/in-pandas-is-inplace-true-considered-harmful-or-not
'programing' 카테고리의 다른 글
내부 조인 동일 테이블 (0) | 2023.09.02 |
---|---|
리눅스에서 C의 밀리초와 나노초의 정확도 차이를 어떻게 출력합니까? (0) | 2023.09.02 |
mysql5.5와 maria를 사용할 수 있습니까?동일한 시스템에 DB 10.0이 있습니까? (0) | 2023.09.02 |
이러한 인라인 블록 디비 요소 사이에 설명할 수 없는 차이가 있는 이유는 무엇입니까? (0) | 2023.09.02 |
JavaScript를 사용하여 긴 배열을 더 작은 배열로 분할하는 방법 (0) | 2023.09.02 |