programing

판다에서, 제자리에서 = 참이 해롭다고 생각합니까, 아니면 아닌가요?

javamemo 2023. 9. 2. 07:55
반응형

판다에서, 제자리에서 = 참이 해롭다고 생각합니까, 아니면 아닌가요?

이에 대해 이전에 논의했지만, 다음과 같은 상반된 대답은 다음과 같습니다.

제가 궁금한 것은:

  • 이유는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공포로 이어질 수 있습니다.SettingWithCopyWarningDataFrame 열에서 호출되는 경우, 때때로 열을 업데이트하지 못할 수 있습니다.

위의 문제점들은 모두 초보자들에게 흔한 함정들이기 때문에, 이 옵션을 제거하면 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

반응형