HOWTO · Pandas

Pandas 복사 DataFrame

이 튜토리얼에서는 DataFrame.copy() 메서드를 사용하여 DataFrame 객체를 복사하는 방법을 소개하고 DataFrame.copy() 메서드 사용을 살펴 봅니다.

이 페이지의 내용

pandas DataFrame을 복사하려면 DataFrame.copy()를 호출합니다. 기본값인 deep=True를 사용하면 별도의 DataFrame이 만들어지므로, 복사본의 셀을 바꾸어도 원본 셀은 바뀌지 않습니다. 데이터를 원본과 독립적으로 편집해야 할 때 이 방법을 사용하세요.

DataFrame.copy() 구문과 복사 깊이

이 메서드는 deep 인수를 받습니다. 사용법은 df.copy(deep=True)입니다. 기본값이 True이므로 df.copy()와 같습니다. deep=True이면 pandas는 DataFrame의 데이터와 인덱스를 복사합니다. 이는 pandas 데이터 구조의 deep 복사이지만, object dtype 셀에 저장된 Python 객체까지 재귀적으로 복사하지는 않습니다. 예를 들어 셀에 변경 가능한 리스트가 들어 있으면 복사된 DataFrame에도 같은 리스트를 가리키는 참조가 남을 수 있습니다. 중첩 객체까지 서로 독립적이어야 한다면 그 객체를 별도로 복사하세요.

deep=False이면 pandas는 데이터와 인덱스를 복사하는 대신 처음에는 원본과 공유합니다. 이후 어느 DataFrame을 통해 값을 할당했을 때의 동작은 pandas 버전과 Copy-on-Write 활성화 여부에 따라 달라집니다. 얕은 복사본의 변경 사항이 항상 원본에 전달된다거나, 모든 환경에서 원본과 분리된다고 가정하지 마세요. 독립성이 중요하면 기본값인 deep 복사를 사용하세요. 데이터를 공유하려는 경우에는 애플리케이션에서 사용하는 pandas 버전과 Copy-on-Write 모드에 대해 문서화된 동작을 확인하세요.

독립적인 DataFrame 복사본 만들기

다음 예제를 실행하세요.

이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.

import pandas as pd

original = pd.DataFrame({"score": [10]})
independent = original.copy()
independent.loc[0, "score"] = 99
print(f"original={original.loc[0, 'score']}, copy={independent.loc[0, 'score']}")
original=10, copy=99

할당은 복사된 DataFrame의 셀을 바꾸지만, original의 값은 10으로 유지됩니다. 이 예제는 기본값인 deep=True를 사용합니다. original.copy(deep=True)라고 쓰면 이 선택을 명시적으로 나타낼 수 있습니다. 바꾸려는 셀은 .loc[row, column]으로 지정하고, 데이터를 비교하거나 다시 사용할 때는 원본 변수를 유지하세요.

deep=False와 데이터 공유 이해하기

얕은 복사는 데이터를 즉시 중복하지 않으면서 새 DataFrame 객체가 필요할 때 유용할 수 있습니다. 하지만 이후 변경의 결과를 항상 보장하지는 않습니다. pandas의 Copy-on-Write 동작과 버전에 따라 쓰기가 분리될 수도 있고 다른 객체를 통해서도 보일 수 있습니다. deep=False는 버전에 따라 변경 동작이 달라지는 선택지로 이해하세요. 두 DataFrame을 함께 수정하는 확실한 방법으로 사용해서는 안 됩니다. 예측 가능한 독립 편집이 필요하면 deep=True를 선택하고, 특정 애플리케이션에서의 동작을 알아야 한다면 해당 애플리케이션의 pandas 버전과 Copy-on-Write 설정을 확인하세요.

deep 인수도 중첩 객체를 서로 독립적으로 만들지는 않습니다. 예를 들어 object dtype 셀에 리스트가 있으면 DataFrame 복사는 pandas 컨테이너를 복사하지만 각 리스트를 재귀적으로 복제하지 않습니다. 따라서 셀의 리스트를 변경하면 두 DataFrame에서 모두 접근할 수 있는 객체에 영향이 갈 수 있습니다. 이 차이가 중요하다면 중첩된 변경 가능 값을 별도로 처리하세요.

DataFrame 또는 열을 변수에 할당하기

other = original처럼 할당하면 다른 변수도 같은 DataFrame 객체를 가리킵니다. 이 할당은 DataFrame.copy()를 호출하지 않으며 독립적인 데이터를 만들지도 않습니다. 어느 변수 이름을 통해 바꾸든 같은 객체가 변경됩니다.

마찬가지로 scores = original["score"]는 열을 pandas Series로 선택하는 것이며, 독립적인 복사본을 명시적으로 요청하지 않습니다. 독립성이 필요할 때 변수 할당이나 열 선택을 복사 대신 사용하지 마세요. DataFrame은 other = original.copy()로, 별도의 Series는 scores = original["score"].copy()로 복사하세요. 이렇게 하면 의도가 분명해지고 우연한 뷰 또는 변경 동작에 의존하지 않습니다. 먼저 필요한 객체를 선택하세요. 표 형태의 작업에는 DataFrame을, 한 열만 다룰 때는 Series를 사용한 뒤, 별도로 편집할 결과가 필요하면 .copy()를 호출하세요.