머신러닝&딥러닝/과제

[머신러닝 과제] Type_of_Loan 원핫인코딩 과제

거북이07 2023. 12. 29. 09:14

Type_of_Loan 원핫인코딩 과제

 

문제

해당 데이터프레임에 있는 Type_of_Loan(대출 상품 타입) 컬럼을 중복제거 후 각 대출 상품에 대한 이름으로 컬럼을 만들고 대출상품이 있는 경우 해당 컬럼에 1을 저장


내가 작성한 코드

# Type_of_Loan의 모든 대출 상품을 변수에 모두 저장
# 각 대출 상품에 대한 이름으로 컬럼을 만들고 대출 상품이 있는 겨웅 해당 컬럼에 1을 저장(원 핫 인코딩 방식)

loan_types = []
for i in credit_df['Type_of_Loan']:
    if str(i) == 'nan':
        pass
    else:
        val = str(i).replace('and ', '')
        arr2 =  val.split(', ')

    for j in arr2:
        if j in loan_types:
            pass
        else:
            loan_types.append(j)
loan_types.append('nan')
print(loan_types)

 

우선 Type_of_Loan에 있는 값의 패턴이 일정하지 않아 ( Auto Loan, Auto Loan, and Not Specified, Credit-Builder Loan .... 등 ) 패턴을 일정하게 변경시켜주는 작업을 먼저 진행해야한다.

 

Type_of_Loan에 값들을 반복시켜 값이 nan일 경우 패스하고 값이 있을 경우 .replace() 함수를 이용하여 and를 제거해주고 .split()을 이용하여 콤마(,) 기준으로 잘라서 배열로 만들어주었다.

for i in credit_df['Type_of_Loan']:
    if str(i) == 'nan':
        pass
    else:
        val = str(i).replace('and ', '')
        arr2 =  val.split(', ')

 

그 다음 반목문을 이용하여 arr2를 j에 담아주고 그 j가 미리 만들어놨떤 loan_types에 있다면 pass 없다면 loan_types에 append할 수 있게 코드를 작성하였다.

    for j in arr2:
        if j in loan_types:
            pass
        else:
            loan_types.append(j)

 

그리고 데이터가 NaN인 경우 nan타입에 체크를 해줘야해서 nan을 loan_types에 append() 해주었다.

loan_types.append('nan')
print(loan_types)

for i in loan_types:
    credit_df[i] = 0

 

반복문을 이용하여 loan_types를 반복시켜 credit_df[i] i컬럼들을 만들어준 후 0으로 초기화시켜주었다.


def oneHot(types, indexes):
    for i, idx in zip(types, indexes):
        val = str(i).replace('and ', '')
        arr2 = val.split(', ')

        for loan_type in loan_types:
            if loan_type in arr2:
                credit_df.loc[idx, loan_type] = 1

oneHot(credit_df['Type_of_Loan'], credit_df.index)

 

oneHot이라는 함수를 만들고 해당 함수 매개변수로 types, indexes를 받아준다.

그리고 그 두 매개변수를 받아 반복문을 이용하여 i, idx에 한개씩 넣어준 후 위에서 했던 데이터 변경 작업을 진행해준다.

 

미리 만들어놓았던 loan_types 리스트를 반복시켜 arr2에 해당 타입이 있으면 credit_df.loc[idx, loan_type] = 1로 변경해준다.


친구가 작성한 코드

unique_loan_lists = credit_df['Type_of_Loan'].str.replace('and ', '').str.split(', ', expand=True).stack().unique()
unique_loan_lists
for i in unique_loan_lists:
    credit_df[i] = credit_df['Type_of_Loan'].apply(lambda x: 1 if (not pd.isna(x)) and (i in x) else 0)

 

credit_df['Type_of_Loan'] 을 str 타입으로으로 변경 후 replace로 'and'를 없애주고 콤마(,)를 기준으로 split해준 데이터를expand=True를 사용하여 데이터 프레임으로 변환시킨다.

그 후 stack() 함수를 사용하여 데이터프레임을 하나로 합쳐준 후  unique() 함수를 이용하여 중복제거를 해준다.

 

그 후 unique_loan_lists를 반복하여 credit_df[i]에 apply() lambda를 이용하여 x가 nan이 아니거나 i안에 x가 있으면 1을 넣어주고 아닐경우 0을 넣어주라는 반복문을 써 credit_df[i]에 0 또는 1을 넣어준다.