Pandas에서 수정하는 방법:settingwithcopywarning
Pandas를 사용할 때 발생할 수 있는 경고 중 하나는 다음과 같습니다.
SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame.
이 경고는 팬더가 체인 할당(체인 할당과 한 단계의 조합)이라는 것을 발견할 때 나타납니다.
이는 단지 경고일 뿐이며 오류가 아니라는 점에 유의하는 것이 중요합니다. 코드는 계속 실행되지만 결과가 항상 예상한 것과 다를 수 있습니다.
이 경고를 억제하는 가장 쉬운 방법은 다음 코드를 사용하는 것입니다.
p.d. options . fashion . chained_assignment = None
다음 예에서는 실제로 이 경고에 대응하는 방법을 보여줍니다.
경고를 재현하는 방법
다음과 같은 pandas DataFrame을 생성한다고 가정합니다.
import pandas as pd #createDataFrame df = pd. DataFrame ({' A ': [25, 12, 15, 14, 19, 23, 25, 29], ' B ': [5, 7, 7, 9, 12, 9, 9, 4], ' C ': [11, 8, 10, 6, 6, 5, 9, 12]}) #view DataFrame df A B C 0 25 5 11 1 12 7 8 2 15 7 10 3 14 9 6 4 19 12 6 5 23 9 5 6 25 9 9 7 29 4 12
이제 원본 DataFrame의 “A” 열만 포함하는 새 DataFrame을 만들고 “A” 열의 각 값을 2로 나눈다고 가정합니다.
#define new DataFrame
df2 = df[[' A ']]
#divide all values in column 'A' by 2
df2[' A '] = df[' A '] / 2
/srv/conda/envs/notebook/lib/python3.7/site-packages/ipykernel_launcher.py:2:
SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
원본 DataFrame의 “슬라이스”에서 열 “A”에 대한 새 값을 설정하고 있기 때문에 SettingWithCopyWarning 메시지를 받습니다.
그러나 우리가 만든 새 DataFrame을 살펴보면 각 값이 실제로 성공적으로 2로 나누어진 것을 볼 수 있습니다.
#view new DataFrame
df2
HAS
0 12.5
1 6.0
2 7.5
3 7.0
4 9.5
5 11.5
6 12.5
7 14.5
경고 메시지를 받았음에도 불구하고 팬더는 여전히 우리가 생각했던 대로 행동했습니다.
경고를 피하는 방법
이 경고를 방지하려면 다음과 같이 .loc[row indexer, col indexer] 구문을 사용하는 것이 좋습니다.
#define new DataFrame
df2 = df. loc [:,[' A ']]
#divide each value in column 'A' by 2
df2[' A '] = df[' A '] / 2
#view result
df2
HAS
0 12.5
1 6.0
2 7.5
3 7.0
4 9.5
5 11.5
6 12.5
7 14.5
새 DataFrame에는 원본 DataFrame의 “A” 열에 있는 모든 값이 2로 나누어 포함되어 있으며 경고 메시지가 표시되지 않습니다.
경고 메시지가 표시되는 것을 방지하려면 다음 코드를 사용할 수 있습니다.
#prevent SettingWithCopyWarning message from appearing p.d. options . fashion . chained_assignment = None
체인 할당을 피해야 하는 이유에 대한 자세한 설명은 온라인 Pandas 설명서를 참조하세요.
추가 리소스
해결 방법: pandas라는 모듈이 없습니다.
해결 방법: numpy라는 모듈이 없습니다.
수정방법: 열이 겹치는데 접미사가 지정되지 않음