[python] Pandas는 뷰와 복사본을 생성하는 데 어떤 규칙을 사용합니까?

데이터 프레임에서 선택한 항목이 원본 데이터 프레임의 복사본인지 또는 원본 뷰인지 결정할 때 Pandas가 사용하는 규칙에 대해 혼란스러워합니다.

예를 들어

df = pd.DataFrame(np.random.randn(8,8), columns=list('ABCDEFGH'), index=range(1,9))

나는 querya가 사본을 반환하므로

foo = df.query('2 < index <= 5')
foo.loc[:,'E'] = 40

원래 데이터 프레임에는 영향을주지 않습니다 df. 또한 스칼라 또는 명명 된 슬라이스가 뷰를 반환하므로 다음과 같은 할당이

df.iloc[3] = 70

또는

df.ix[1,'B':'E'] = 222

변경 df됩니다. 그러나 더 복잡한 경우에 관해서는 길을 잃었습니다. 예를 들면

df[df.C <= df.B] = 7654321

변경 df하지만

df[df.C <= df.B].ix[:,'B':'E']

하지 않습니다.

내가 방금 놓친 판다 스가 사용하는 간단한 규칙이 있습니까? 이 특정한 경우에 무슨 일이 일어나고 있는지; 특히 특정 쿼리를 충족하는 데이터 프레임에서 모든 값 (또는 값의 하위 집합)을 변경하려면 어떻게해야합니까 (위의 마지막 예에서 시도한 것처럼)?


참고 : 이것은 이 질문 과 동일하지 않습니다 . 그리고 나는 문서를 읽었 지만 그것에 대해 깨닫지 못했습니다. 또한이 주제에 대한 “관련”질문을 읽었지만 Pandas가 사용하는 간단한 규칙과이를 적용하는 방법 (예 : 값 (또는 값의 하위 집합) 수정)이 여전히 누락되어 있습니다. 특정 쿼리를 충족하는 데이터 프레임에서.



답변

다음은 규칙, 후속 재정의입니다.

  • 모든 작업은 복사본을 생성합니다.

  • inplace=True제공되는 경우 제자리에서 수정됩니다. 일부 작업 만이를 지원합니다.

  • 설정하는 인덱서, 예를 들어 .loc/.iloc/.iat/.at제자리에 설정됩니다.

  • 단일 유형의 개체를 가져 오는 인덱서는 거의 항상 뷰입니다 (메모리 레이아웃에 따라 이것이 신뢰할 수없는 이유가 아닐 수도 있습니다). 이것은 주로 효율성을위한 것입니다. (위의 예는 for입니다 .query. 이것은 항상에 의해 평가 된 사본을 반환합니다 numexpr)

  • 다중 형식 개체에 대한 인덱서는 항상 복사본입니다.

귀하의 예 chained indexing

df[df.C <= df.B].loc[:,'B':'E']

작동이 보장되지 않습니다 (따라서 절대 이렇게 하지 말아야합니다).

대신 다음을 수행하십시오.

df.loc[df.C <= df.B, 'B':'E']

이것이 더 빠르고 항상 작동하기 때문에

체인 인덱싱은 2 개의 개별 파이썬 작업이므로 pandas가 안정적으로 가로 챌 수 없습니다 (종종를 얻지 SettingWithCopyWarning만 100 % 감지 할 수는 없습니다). dev에 워드 프로세서 는 지적, 훨씬 더 자세한 설명을 제공합니다.


답변