데이터 프레임에서 선택한 항목이 원본 데이터 프레임의 복사본인지 또는 원본 뷰인지 결정할 때 Pandas가 사용하는 규칙에 대해 혼란스러워합니다.
예를 들어
df = pd.DataFrame(np.random.randn(8,8), columns=list('ABCDEFGH'), index=range(1,9))
나는 query
a가 사본을 반환하므로
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에 워드 프로세서 는 지적, 훨씬 더 자세한 설명을 제공합니다.