[python] inplace = True 이해

에서 pandas라이브러리를 여러 번 다음 문 등 인플레 이스 객체를 변경하는 옵션이 있습니다 …

df.dropna(axis='index', how='all', inplace=True)

나는 무엇을 반환하고 객체 inplace=True가 전달 될 때와 언제 전달 되는지에 대해 궁금합니다 inplace=False.

모든 작업이 self언제 수정 inplace=True됩니까? 그리고 언제 inplace=False새로운 객체가 즉시 생성 new_df = self되고 new_df반환됩니까?



답변

inplace=True전달됩니다 당신이 사용하는 거라고, 그래서 데이터는, 장소 (는 아무 것도 반환하지 않습니다)에 이름이 변경됩니다 :

df.an_operation(inplace=True)

inplace=False가 전달 되면 (기본값이므로 필요하지 않음) 작업을 수행하고 객체의 복사본을 반환하므로 다음을 사용합니다.

df = df.an_operation(inplace=False)


답변

팬더에서 inplace = True는 유해한 것으로 간주됩니까?

TLDR; 네, 그렇습니다.

  • inplace, 이름이 의미하는 것과 달리, 종종 복사본 생성을 방해하지 않으며 (거의) 성능상의 이점을 제공하지 않습니다.
  • inplace 메소드 체인에서 작동하지 않습니다.
  • inplace 초보자에게 일반적인 함정이므로이 옵션을 제거하면 API가 단순화됩니다.

이 매개 변수는 용도가 거의 없기 때문에 설정하지 않는 것이 좋습니다. 인수가 API 전체에서 더 이상 사용되지 않음 을 제안하는 이 GitHub 문제 를 참조하세요 inplace.

사용 inplace=True하면 더 효율적이거나 최적화 된 코드가 생성 된다는 것은 일반적인 오해입니다 . 실제로 .NET 을 사용하면 성능상의 이점전혀 없습니다inplace=True . 모두의 장소 및 버전은 데이터의 복사본을 생성 아웃 오브 장소 어쨌든 인플레 이스 (in-place) 버전은 자동으로 복사 등을 지정하여,.

inplace=True초보자에게 흔한 함정입니다. 예를 들어 다음을 트리거SettingWithCopyWarning 할 수 있습니다 .

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

DataFrame 열에서 함수를 호출하면 작동 inplace=True 하거나 작동하지 않을 수 있습니다 . 이는 체인 인덱싱이 관련된 경우 특히 그렇습니다.

위에서 설명한 문제만으로는 충분하지 않은 것처럼 메서드 체인을 방해inplace=True 하기도 합니다 . 작업 대비

result = df.some_function1().reset_index().some_function2()

반대로

temp = df.some_function1()
temp.reset_index(inplace=True)
result = temp.some_function2()

전자는 더 나은 코드 구성과 가독성을 제공합니다.


또 다른 지원 주장은 API set_axis가 최근에 inplace기본값이 True에서 False로 변경되도록 변경되었다는 것 입니다. GH27600을 참조하십시오 . 훌륭한 개발자!


답변

내가 사용하는 방법은

# Have to assign back to dataframe (because it is a new copy)
df = df.some_operation(inplace=False)

또는

# No need to assign back to dataframe (because it is on the same copy)
df.some_operation(inplace=True)

결론:

 if inplace is False
      Assign to a new variable;
 else
      No need to assign


답변

inplace매개 변수 :

df.dropna(axis='index', how='all', inplace=True)

Pandas일반적인 수단 :

1. Pandas는 원본 데이터의 복사본을 만듭니다.

2. … 그것에 대해 계산을합니다.

3. … 결과를 원본 데이터에 할당합니다.

4. … 사본을 삭제합니다.

당신은 내 대답의 나머지 부분에서 읽을 수 있듯이 우리는 여전히 더 아래의 IE의이 매개 변수를 사용하는 좋은 이유가 inplace operations있지만, 우리가 할 수있는 경우가로 더 많은 문제를 발생으로 우리는 그것을 피해야한다 :

1. 코드를 디버그하기가 더 어려워집니다 (실제로 SettingwithCopyWarning 은이 가능한 문제에 대한 경고를 의미합니다)

2. 메소드 체인과의 충돌

그래서 우리가 그것을 사용해야 할 경우도 있습니까?

분명하게 예입니다. 팬더 또는 거대한 데이터 세트를 처리하는 도구를 사용하면 일부 빅 데이터가 전체 메모리를 소비 할 수있는 상황에 쉽게 직면 할 수 있습니다. 이 원치 않는 효과를 피하기 위해 메서드 체인 과 같은 몇 가지 기술을 사용할 수 있습니다 .

(
    wine.rename(columns={"color_intensity": "ci"})
    .assign(color_filter=lambda x: np.where((x.hue > 1) & (x.ci > 7), 1, 0))
    .query("alcohol > 14 and color_filter == 1")
    .sort_values("alcohol", ascending=False)
    .reset_index(drop=True)
    .loc[:, ["alcohol", "ci", "hue"]]
)

이는 코드를 더 간결하게 만들고 (해석과 디버그도 더 어렵지만) 연결된 메서드가 다른 메서드의 반환 된 값과 함께 작동하므로 메모리를 덜 사용하므로 입력 데이터의 복사본 이 하나만 생성됩니다 . 이 작업 후에 원래 데이터 메모리 사용량 이 2 배가 될 것임을 분명히 알 수 있습니다 .

또는 inplace매개 변수 를 사용할 수 있습니다 (해석 및 디버깅도 더 어렵지만) 메모리 소비는 2 x 원본 데이터 이지만이 작업 후 메모리 소비는 1 x 원본 데이터로 유지 됩니다. 누군가가 거대한 데이터 세트로 작업 할 때마다 정확히 알고있는 경우 큰 이익.

최종 결론 :

inplace대용량 데이터로 작업하지 않는 한 매개 변수 사용을 피하고 여전히 사용하는 경우 가능한 문제를 인식하십시오.


답변

동일한 변수에 저장

data["column01"].where(data["column01"]< 5, inplace=True)

별도의 변수에 저장

data["column02"] = data["column01"].where(data["column1"]< 5)

하지만 언제든지 변수를 덮어 쓸 수 있습니다.

data["column01"] = data["column01"].where(data["column1"]< 5)

참고 : 기본적으로 inplace = False


답변

함수를 사용하여 Pandas 데이터 프레임을 변경하려고 할 때 데이터 프레임에 변경 사항을 커밋하려면 ‘inplace = True’를 사용합니다. 따라서 다음 코드의 첫 번째 줄은 ‘df’의 첫 번째 열 이름을 ‘Grades’로 변경합니다. 결과 데이터베이스를 보려면 데이터베이스를 호출해야합니다.

df.rename(columns={0: 'Grades'}, inplace=True)
df

변경 사항을 커밋하지 않고 결과 데이터베이스 만 인쇄 할 때 ‘inplace = False'(기본값이기도 함)를 사용합니다. 따라서 실제로 커밋 된 변경 사항이있는 원본 데이터베이스의 복사본은 원본 데이터베이스를 변경하지 않고 인쇄됩니다.

더 명확하게하기 위해 다음 코드는 동일한 작업을 수행합니다.

#Code 1
df.rename(columns={0: 'Grades'}, inplace=True)
#Code 2
df=df.rename(columns={0: 'Grades'}, inplace=False}


답변

inplace=True 원본 df를 변경 하려는지 여부에 따라 사용됩니다.

df.drop_duplicates()

삭제 된 값만 볼 수 있지만 df는 변경하지 않습니다.

df.drop_duplicates(inplace  = True)

값을 삭제하고 df를 변경합니다.

도움이 되었기를 바랍니다.:)