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


118

데이터 프레임에서 선택한 항목이 원본 데이터 프레임의 복사본인지 또는 원본 뷰인지 결정할 때 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가 사용하는 간단한 규칙과이를 적용하는 방법 (예 : 값 (또는 값의 하위 집합) 수정)이 여전히 누락되어 있습니다. 특정 쿼리를 충족하는 데이터 프레임에서.

답변:


138

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

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

  • 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에 워드 프로세서 는 지적, 훨씬 더 자세한 설명을 제공합니다.


3
.queryn numexpr에 의해 평가되기 때문에 항상 (뷰가 아닌) 무엇을하고 있기 때문에 복사본을 반환합니다. 나는 '규칙'에 그것을 추가 할 것입니다 그래서
제프

3
pandas는 numpy에 의존하여 뷰 생성 여부를 결정합니다. 단일 dtype 경우 (시리즈의 경우 1-d, 프레임의 경우 2-d 등). numpy 뷰를 생성 할 수 있습니다. 그것은 당신이 무엇을 자르 느냐에 달려 있습니다. 때때로 당신은보기를 얻을 수 있고 때때로 당신은 할 수 없습니다. pandas는 뷰 생성 여부가 항상 분명하지 않기 때문에이 사실에 전혀 의존하지 않습니다. 그러나 loc이 설정할 때 이것에 의존하지 않기 때문에 이것은 중요하지 않습니다. 그러나 체인 인덱싱시 이것은 매우 중요합니다 (따라서 체인 인덱싱이 나쁜 이유)
Jeff

3
Jeff에게 감사합니다. 귀하의 답변이 가장 유용합니다. 이 주제에 대한 출처 / 참조는 무엇입니까?
Kamixave

4
그럼 먼저 수고하셨습니다! 둘째, 충분한 시간이 있다면 문서의 주요 답변과 유사한 단락을 추가하는 것이 좋을 것 같습니다.
Kamixave

2
확실히 문서를 추가 / 수정하려면 풀 요청이 필요합니다. 그것을 위해 가십시오.
제프
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.