inplace = True 이해


109

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

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

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

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


14
예, inplace=True반환 None inplace=False은 작업이 수행 된 객체의 복사본을 반환 합니다. 문서는 이것에 대해 꽤 분명합니다. 특정 부분과 혼동되는 것이 있습니까? SpeficallyIf True, do operation inplace and return None.
EdChum

나는 DataFrame 객체를 서브 클래 싱하고 있는데, 병합과 같은 작업으로 제자리에서 그것을 할 수없는 것 같습니다 ... self = self.merge(new_df, how='left', on='column2' 나는 자신을 재 할당 할 수 있는지 확신하지 못합니다
Aran Freel

1
DataFrame.mergeinplace인수 가 없다는 것이 맞습니다 . DataFrame을 반환하므로 재 할당하는 데 문제가 없습니다.
JAV

누군가가 자원 소비 측면에서 사용의 이점을 강조 할 수 있습니까?
markroxor

2
@markroxor 정말 많지 않습니다. 경우에 따라 inplace실제로 결과 사본을 반환 할 필요가 없기 때문에 작업이 조금 더 빠를 수 있습니다. 하지만 그게 다입니다. 그것을 사용하지 않는 더 많은 이유가 있습니다.
cs95

답변:


99

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

df.an_operation(inplace=True)

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

df = df.an_operation(inplace=False) 

inplace이것이 기존 데이터를 변경하는 방법에 대한 옵션 일뿐 데이터를 '재 형성'하는 방법에 대한 옵션이 아니라고 생각하는 것이 옳을 까요? 예를 들어, 기존 인덱스에 값을 적용하므로 .set_index (inplace = True) 할 수 있지만 이전 배열에 존재하지 않았던 DataFrame에 추가 행을 만들 수 있기 때문에 .reindex (inplace = True) 할 수 없습니다. ?
ac24

4
이 메서드 .dropna()inplace=True데이터 프레임을 허용 하고 가장 확실하게 재구성 할 수 있으므로 아니요.
jorijnsmit

3
여기서 조심해야합니다. @ ac24는 실제로 다소 옳습니다. dropna다른 모양의 데이터 프레임을 반환하는 동안 실제로 기본 데이터의 모양을 변경하지는 않습니다. 단순히 데이터 위에 마스크를 반환하기 때문에 (when inplace=False) 두려운 SettingWithCopyWarning. 이전 값 배열에 대한 참조가 더 이상 없을 때만 팬더가 마스크에 따라 모양이 변경됩니다. 더 나은 경험 법칙은 다음과 같습니다. inplace작업에서 새로운 백업 값을 할당 할 필요가 없을 때 사용할 수 있습니다.
BallpointBen

49

팬더에서 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을 참조하십시오 . 훌륭한 개발자!


1
물론 inplace=True체이닝 등에서는 작동하지 않지만 개념적으로 무엇을하고 있는지 이해하는 것이 분명합니다. 개인적으로 나는 할당을 피하는 것이 조금 더 깔끔하다는 것을 알았습니다 list.sort. 표준 라이브러리에서 등 을 제거하는 것을 선호 하십니까?
Chris_Rands 2010

4
나는 그것이 공정한 비교라고 생각하지 않습니다. list.sort와 sorted를 사용하면 몇 가지 분명한 이점이 있습니다. 다른 제자리 기능도 마찬가지입니다. 여기에는 실질적인 이점이 없습니다. 메소드 체인은 팬더에서 훨씬 더 일반적이며 어쨌든이 인수의 사용 중단에 대한 계획이 있습니다.
cs95

또한 할당을 피하는 것이 조금 더 깔끔하다는 것을 알았습니다. 예를 들어 python list.append()도 제자리에있는 반면 pandas df.append는 제자리에 있지 않습니다 (그리고 in은 inplace도 지원하지 않습니다). 이것이 제가 알고 싶은 이유입니다. 실제 이점이 무엇인지 이해하고 싶습니다. 할당을 피하는 것 외에 list.sort와 sorted를 사용하는 것의 명백한 이점은 무엇입니까? 그렇지 않으면 여기에 실질적인 이점이 있다고 생각합니다. 할당을 피할 수있어 개인적으로 더 읽기 쉽습니다.
sdbbs

1
@sdbbs list.append()는 기존 목록에 추가합니다. df.append데이터의 복사본을 만든 다음 (5 개 행 또는 5 백만 개는 상관 없음) 복사본에 새 행을 추가 한 다음 반환합니다. 어떤 것이 더 의미가 있다고 생각하십니까? df.append에 관해서는 가능한 한 많이 피하십시오 . inplace = True라고 주장하는 것이 좋은 예라고 생각하지 않습니다. 그 함수가 API에 자리를 차지한다고 생각하지도 않습니다.
cs95

46

내가 사용하는 방법은

# 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

5
안녕하세요 @Nabin, :-) 팬더와 NumPy와 작업을 사람이 너무 분명 그게 방법
Vetrivel PS

6

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


2

동일한 변수에 저장

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


1

함수를 사용하여 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}

0

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

df.drop_duplicates()

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

df.drop_duplicates(inplace  = True)

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

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


0

inplace=True기능을 불순하게 만듭니다. 원래 데이터 프레임을 변경하고 None을 반환합니다. 이 경우 DSL 체인이 끊어집니다. 대부분의 데이터 프레임 함수는 새로운 데이터 프레임을 반환하기 때문에 DSL을 편리하게 사용할 수 있습니다. 처럼

df.sort_values().rename().to_csv()

inplace=True없음 을 반환하고 DSL 체인이 끊어진 함수 호출 . 예를 들면

df.sort_values(inplace=True).rename().to_csv()

던질 것이다 NoneType object has no attribute 'rename'

파이썬의 내장 정렬 및 정렬과 비슷한 것입니다. 새 목록을 lst.sort()반환 None하고 sorted(lst)반환합니다.

일반적으로 inplace=True특별한 이유 가없는 한 사용 하지 마십시오 . 와 같은 재 할당 코드를 작성해야 할 때 df = df.sort_values()DSL 체인에 함수 호출을 첨부하십시오.

df = pd.read_csv().sort_values()...

올바른 형식으로 정확한 작업 코드를 제공하면 사용자가 답변을 더 빨리 이해할 수 있습니다. 당신에게도 똑같이 요청합니다. 그래서 당신이 대답 할 수없는 포맷, 팬더 전문가가 아니지만, 그 추천,
아난드 Vaidya

0

판다에 대한 나의 경험만큼 대답하고 싶습니다.

'inplace = True'인수는 데이터 프레임이 영구적으로 변경해야 함을 나타냅니다.

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

동일한 데이터 프레임을 변경합니다 (이 팬더가 인덱스에서 NaN 항목을 찾아서 삭제하므로). 우리가 시도하면

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

pandas는 우리가 변경 한 데이터 프레임을 보여 주지만 원래 데이터 프레임 'df'를 수정하지는 않습니다.


0

inplace = True를 사용하지 않거나 inplace = False를 사용하면 기본적으로 복사본이 반환됩니다.

예를 들어 :

testdf.sort_values(inplace=True, by='volume', ascending=False)

내림차순으로 정렬 된 데이터로 구조를 변경합니다.

그때:

testdf2 = testdf.sort_values( by='volume', ascending=True)

testdf2를 복사본으로 만듭니다. 값은 모두 동일하지만 정렬이 반대로되어 독립적 인 개체를 갖게됩니다.

그런 다음 다른 열이 주어지면 LongMA라고 말하면 다음을 수행합니다.

testdf2.LongMA = testdf2.LongMA -1

testdf의 LongMA 열에는 원래 값이 있고 testdf2에는 구분 된 값이 있습니다.

계산 체인이 커지고 데이터 프레임 사본에 자체 수명주기가 있으므로 차이를 추적하는 것이 중요합니다.


0

예, Pandas에는 많은 함수에 매개 변수가 inplace있지만 기본적으로 False.

그래서 당신이 할 때 df.dropna(axis='index', how='all', inplace=False) orignial을 변경하고 싶지 않다고 생각 DataFrame하므로 대신 필요한 변경 사항 으로 새 복사본만듭니다 .

그러나 inplace매개 변수를 다음과 같이 변경하면True

그 다음은 명시 적으로 나는 새 복사본 싶지 않아 말을 동등 DataFrame주어진에 변경을 대신를DataFrame

이것은 파이썬 인터프리터가 없는 새로운을 만들 수 있습니다DataFrame

그러나 inplace결과를 원래 DataFrame에 다시 할당하여 매개 변수 사용을 피할 수도 있습니다.

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.