728x90
위처럼 결측치가 있는 데이터는 ML개발을 할 때 에러가 발생하기 때문에 아래 사진처럼 dropna()를 사용해,
결측치를 제거해주고 개발을 시작했다.
X를 설정 후 문자열 데이터가 들어가있기 때문에,
X_new = pd.DataFrame()
for name in X.columns :
print(name)
# 각 컬럼데이터를 가져온다.
data=X[name]
# 문자열인지 아닌지 나눠서 처리하면 된다.
if data.dtype == object :
# 문자열이니, 갯수가 2개인지 아닌지 파악해서
# 2개이면 레이블 인코딩, 그렇지 않으면
# 원핫 인코딩 하도록 코드 작성
if data.nunique() <= 2 :
#레이블 인코딩
label_encoder = LabelEncoder()
X_new[name]=label_encoder.fit_transform(data)
else :
# 원핫 인코딩
ct = ColumnTransformer ( [('encoder',OneHotEncoder(),[0])],
remainder='passthrough')
col_names=sorted(data.unique())
X_new[col_names]=ct.fit_transform(data.to_frame())
else :
# 숫자 데이터 처리
X_new[name] = data
위와같이 코드를 작성하면,
위 사진과 같이 결측치를 제거하고 작업을 했음에도 결측치가 생기는 것을 볼 수있다.
이유부터 말 하자면, 인덱스의 숫자가 dropna를 하면서 뒤죽박죽 되어버렸기 때문이다.
그래서 위 코드에서 한줄을 추가해주면 오류를 해결할 수 있다.
data.reset_index(inplace=True,drop=True)
X_new = pd.DataFrame()
for name in X.columns :
print(name)
# 각 컬럼데이터를 가져온다.
data=X[name]
data.reset_index(inplace=True,drop=True)
# 문자열인지 아닌지 나눠서 처리하면 된다.
if data.dtype == object :
# 문자열이니, 갯수가 2개인지 아닌지 파악해서
# 2개이면 레이블 인코딩, 그렇지 않으면
# 원핫 인코딩 하도록 코드 작성
if data.nunique() <= 2 :
#레이블 인코딩
label_encoder = LabelEncoder()
X_new[name]=label_encoder.fit_transform(data)
else :
# 원핫 인코딩
ct = ColumnTransformer ( [('encoder',OneHotEncoder(),[0])],
remainder='passthrough')
col_names=sorted(data.unique())
X_new[col_names]=ct.fit_transform(data.to_frame())
else :
# 숫자 데이터 처리
X_new[name] = data
NaN이 사라지고 잘 작동하는 것을 확인할 수 있다.
'디버깅 ( 오류 해결 과정 )' 카테고리의 다른 글
MySQL - 테이블 이름과 MySQL의 키워드가 같을 때 오류 해결방법 (0) | 2023.01.17 |
---|---|
AWS Lambda Layer ModuleNotFoundError ( 라이브러리 종속성,dependency ) (0) | 2023.01.12 |
PuTTY - AWS EC2 방화벽 설정하기 (0) | 2022.12.14 |
MYSQL - 오류 error : 1062 ["error": "1062 (23000): Duplicate entry '0' for key] 해결방법 (0) | 2022.12.08 |
MySQL - foreign key constraint fails 에러 ERROR CODE : 1451 해결방법 (1) | 2022.12.08 |