7회 기출문제 작업형1번 df 변환 후 저장되는 방식 질문
2
投稿した質問数 8
7회 기출문제 작업형 1을 풀다가 조건 cond를 설정해서 문제에서 정해준 조건에 만족하는 위치에 score 컬럼 값을 표준화해 저장하려 했습니다.
그래서 아래의 코드와 같이 df[cond1 & cond2]로 스케일링을 했는데 이후에 print(df)를 하면 score 컬럼의 값이 스케일링하기 전의 값들로 결과가 출력되는지 궁금합니다.
다른 문제들도 어떨때는 df = df.변환 하면 저장되어서 출력되고, 또 어떤 경우에는 안되고에 대한 기준을 모르겠습니다.
import pandas as pd
df = pd.read_csv("https://raw.githubusercontent.com/lovedlim/inf/refs/heads/main/p4/7_1/student_assessment.csv")
# 결측치 제거
# print(df.head(5))
# print(df.info())
# print(df.isnull().sum())
df = df.dropna()
# print(df.isnull().sum())
# 가장 많은 학생이 수강한 과목 = 12
# print(df['id_assessment'].value_counts())
# print(df.head(5))
# 12 과목의 score 컬럼을 표준화 한 뒤에 표준화
from sklearn.preprocessing import StandardScaler
# print(dir(preprocessing))
scl = StandardScaler()
cond1 = df['id_assessment'] == 12
cond2 = df['score']
# 질문 부분 시작
print("스케일링 전: ",df[cond1 & cond2].describe())
df[cond1 & cond2] = scl.fit_transform(df[cond1 & cond2])
print("스케일링 후: ",df[cond1 & cond2].describe())
print(df)
# 질문 부분 마침
# print(df[cond1 & cond2].max())
# print(round(2.183422, 3))
# 답: 2.183
回答 1
0
안녕하세요, 인프런 AI 인턴입니다. HOJUN CHOI님.
질문해 주신 부분에 대해 설명드리겠습니다. 데이터프레임 df에서 특정 조건에 맞는 부분을 인덱싱하여 치환하려고 할 때, pandas의 기본적인 동작방식으로 인해 변경이 바로 적용되지 않는 경우가 있을 수 있습니다.
이유와 이해
df[cond1 & cond2]로 가져온 부분은 뷰(View)라고 볼 수 있는데, 이는 기존 DataFrame의 데이터를 복사하여 새로운 데이터프레임을 생성하는 것이 아닌 해당 부분만을 참고하는 일종의 ‘뷰’를 만듭니다. 따라서 직접적으로 이러한 인덱싱을 통해 DataFrame의 일부를 변경하면 전체 DataFrame에 적용되기 힘든 경우가 발생할 수 있습니다.
해결책
loc를 사용:pandas에서 인덱싱 연산 후에 값의 할당을 직접적으로 하려면loc를 사용하는 것이 권장됩니다. 예를 들어,df.loc[cond1 & cond2, '열이름'] = 값형태로 사용합니다.
- Copy와 DataFrame 특성: Indexing으로 먼저 유사한 DataFrame을 만드는 경우에는 이 데이터에서 변환을 완료한 뒤 원래의 DataFrame에 덮어씌우는 형태로 조작할 수 있습니다.
import pandas as pd
from sklearn.preprocessing import StandardScaler
df = pd.read_csv("https://raw.githubusercontent.com/lovedlim/inf/refs/heads/main/p4/7_1/student_assessment.csv")
df = df.dropna()
scl = StandardScaler()
cond1 = df['id_assessment'] == 12
# loc를 사용한 방식
df.loc[cond1, 'score'] = scl.fit_transform(df.loc[cond1, ['score']])
print("스케일링 후: ", df[cond1].describe())
print(df)
이렇게 하는 경우, df의 설정된 조건에 대한 score 값이 올바르게 변환되어 반영될 수 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
3 유형 귀무가설, 대립가설
0
9
2
인코딩 관련 질문 있습니다
0
11
2
작업형3 이원분산분석 sm에서불러오기 / anova_lm 차이
0
7
2
2유형 원핫인코딩 오류
0
15
2
시험장에서 주석 단축키 안될 때 많나요?
0
22
2
라벨인코딩 방식
0
19
2
test 재학습 관련
0
13
2
target 빈도 확인
0
15
2
작업형 2 연습문제 섹션 6
0
17
2
F1-score
0
17
2
작업형 2번 섹션 3
0
15
2
작업형 2 인코딩, 결측치, 모델 선택 질문
0
19
1
인코딩 방식 문의
0
24
2
9회 3유형 ==> 7회 3유형 질문드려요
0
15
2
작업형 2관련 질문입니다
0
13
2
작업형2 카테고리
0
23
2
110강 회귀_8번 문의
0
15
2
XGBRegressor 학습 시 warning 출력
0
21
2
데이터 프레임을 변경해도 되나요?
0
13
2
10회 기출 작업형3 문제 2-1 질문
0
22
2
작업형 2 질문
0
24
2
작업형 2 템플릿 확인 요청
0
24
2
작업형2 인코딩 질문
0
26
2
작업형 3 벼락치기 공부방법 질문
0
35
2

