7회 기출문제 작업형1번 df 변환 후 저장되는 방식 질문
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
답변 2
0
cond1 = df['id_assessment'] == 12
는 참과 거짓이cond1에 저장되지만
cond2 = df['score'] 는 조건이 아니라 데이터 프레임이 저장됩니다.
따라서 df[cond1 & cond2]는 불가 합니다.
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 값이 올바르게 변환되어 반영될 수 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
수강 연장 가능 여부 문의
0
3
1
강의 구매했는데 교재 필수일까요
0
8
2
수강기간 연장 가부 문의드립니다.
0
11
2
수강기간 연장이 가능한지 양해를 구하며 문의를 드립니다.
0
21
2
작업형2 모의문제2에서 drop이랑 인코딩
0
23
2
인코딩을 다 꼭 해봐야하는지
0
31
2
안녕하세요? 강사님 질문있습니다.(인코딩관련)
0
57
2
이진분류에서 양성 클래스가 0일 때 평가 방법
0
46
2
원핫인코딩 전 train과 test 병합여부
0
50
2
수강기간 연장
0
67
2
29강 작업2형의 이상치 처리
0
64
2
수강기간 연장 문의드립니다!
0
65
2
9월에 실기출제기준 개정내역에 신설된부분
0
55
1
작업형2 모의문제2 결과값 관련 문의드립니다.
0
66
2
12회차 시험 실패 후 13회 도전 예정입니다.
0
55
1
random_state 값
0
72
2
강의 연장 문의 드립니다.
0
66
2
강의 연장 문의
0
61
2
오징어게임
0
69
1
object 컬럼이 여러 개인 경우 인코딩 전처리 방법
1
49
2
데이터 전처리 순서 관련
0
64
2
작업형2 모의문제 데이터 불러오기
0
62
2
강의 연장 부탁드립니다!
0
67
2
수강기간 연장 문의드립니다!
0
65
2





