공부/자격증

[빅데이터 분석기사 실기] 데이터 전처리 python 100 - 6

Moonie' 2024. 10. 22. 14:56
반응형

아래 블로그를 참고하여 진행했습니다.

https://www.datamanim.com/dataset/99_pandas/pandasMain.html#google_vignette

 

 

이전 블로그에 이어서 작성했습니다.

https://moonie.tistory.com/37

 

 

04_Apply , Map

 

Question 56  데이터를 로드하고 데이터 행과 열의 갯수를 출력하라

import pandas as pd
dataurl='https://raw.githubusercontent.com/Datamanim/pandas/main/BankChurnersUp.csv'
df = pd.read_csv(dataurl)

 

Question 57 Income_Category의 카테고리를 map 함수를 이용하여 다음과 같이 변경하여 newIncome 컬럼에 매핑하라 

Unknown : N
Less than $40K : a
$40K - $60K : b
$60K - $80K : c
$80K - $120K : d
$120K +’ : e

dic = {
    'Unknown'        : 'N',
    'Less than $40K' : 'a',
    '$40K - $60K'    : 'b',
    '$60K - $80K'    : 'c',
    '$80K - $120K'   : 'd',
    '$120K +'        : 'e'   
}

df['newIncome']  =df.Income_Category.map(lambda x: dic[x])

Ans = df['newIncome']

.map():

  • **.map()**은 Pandas 시리즈(열)에 대해 각 요소를 다른 값으로 변환하는 메서드입니다.
  • 이 메서드는 각 요소에 대해 변환 작업을 수행할 때 사전(dictionary) 또는 함수를 사용할 수 있습니다.
  • 여기서는 lambda x: dic[x]라는 람다 함수를 사용하여, Income_Category 열의 각 값(x)을 **사전 dic**을 참조하여 변환하고 있습니다.

lambda x: dic[x]:

  • 람다 함수는 간단한 익명 함수로, 이 경우 Income_Category의 각 값을 입력받아, 해당 값을 사전 dic에서 찾은 후 반환하는 역할을 합니다.
  • 예를 들어, Income_Category에 있는 값이 "Low"라면, dic['Low']를 반환합니다.
  • 즉, Income_Category의 각 값은 dic 사전에서 매핑된 값으로 변환됩니다.

 

Question 58 Income_Category의 카테고리를 apply 함수를 이용하여 다음과 같이 변경하여 newIncome 컬럼에 매핑하라 Unknown : N
Less than $40K : a
$40K - $60K : b
$60K - $80K : c
$80K - $120K : d
$120K +’ : e

 

apply 함수는 파이썬의 pandas 라이브러리에서 매우 유용하게 사용되는 함수 중 하나로, 데이터프레임의 각 행이나 열에 대해 함수를 적용할 때 사용됩니다.

 

def changeCategory(x):
    if x =='Unknown':
        return 'N'
    elif x =='Less than $40K':
        return 'a'
    elif x =='$40K - $60K':   
        return 'b'
    elif x =='$60K - $80K':    
        return 'c'
    elif x =='$80K - $120K':   
        return 'd'
    elif x =='$120K +' :     
        return 'e'

df['newIncome']  =df.Income_Category.apply(changeCategory)

Ans = df['newIncome']

 

 

Question 59 Customer_Age의 값을 이용하여 나이 구간을 AgeState 컬럼으로 정의하라. (0~9 : 0 , 10~19 :10 , 20~29 :20 … 각 구간의 빈도수를 출력하라

 

df['AgeState'] = df.Customer_Age.map(lambda x:x//10 *10)
Ans = df['AgeState'].value_counts().sort_index()
Ans

 

Question 60 Education_Level의 값중 Graduate단어가 포함되는 값은 1 그렇지 않은 경우에는 0으로 변경하여 newEduLevel 컬럼을 정의하고 빈도수를 출력하라

 

df['newEduLevel'] = df.Education_Level.map(lambda x : 1 if 'Graduate' in x else 0)
Ans = df['newEduLevel'].value_counts()
Ans

 

Question 61

Credit_Limit 컬럼값이 4500 이상인 경우 1 그외의 경우에는 모두 0으로 하는 newLimit 정의하라. newLimit 각 값들의 빈도수를 출력하라

df['newLimit'] = df.Credit_Limit.map(lambda x : 1 if x>=4500 else 0)
Ans = df['newLimit'].value_counts()
Ans

Question 62

Marital_Status 컬럼값이 Married 이고 Card_Category 컬럼의 값이 Platinum인 경우 1 그외의 경우에는 모두 0으로 하는 newState컬럼을 정의하라. newState의 각 값들의 빈도수를 출력하라

 

def check(x):
    if x.Marital_Status == 'Married' and x.Card_Category == 'Platinum' :
        return 1
    else :
        return 0

df['newState'] = df.apply(check,axis=1)
Ans = df['newState'].value_counts()
Ans

 

Question 63

Gender 컬럼값 M인 경우 male F인 경우 female로 값을 변경하여 Gender 컬럼에 새롭게 정의하라. 각 value의 빈도를 출력하라

def ChangeGender(x):
    if x == 'M':
        return 'male'
    else :
        return 'female'

df['Gender'] = df.Gender.apply(ChangeGender)
Ans = df['Gender'].value_counts()
Ans

05_Time_Series

Question 64

데이터를 로드하고 각 열의 데이터 타입을 파악하라

import pandas as pd
DataUrl = 'https://raw.githubusercontent.com/Datamanim/pandas/main/timeTest.csv'
df = pd.read_csv(DataUrl)
df.info()

 

Question 65

Yr_Mo_Dy을 판다스에서 인식할 수 있는 datetime64타입으로 변경하라

df.Yr_Mo_Dy = pd.to_datetime(df.Yr_Mo_Dy)
Ans = df.Yr_Mo_Dy
Ans.head(4)

 

pd.to_datetime() 함수는 pandas의 날짜 처리 함수로, 주어진 데이터를 날짜 형식(datetime)으로 변환해줍니다.

 

Question 66

Yr_Mo_Dy에 존재하는 년도의 유일값을 모두 출력하라

df.Yr_Mo_Dy.dt.year.unique()

 

Question 67

Yr_Mo_Dy에 년도가 2061년 이상의 경우에는 모두 잘못된 데이터이다. 해당경우의 값은 100을 빼서 새롭게 날짜를 Yr_Mo_Dy 컬럼에 정의하라

 

def fix_century(x):
    import datetime
    
    year = x.year - 100 if x.year >= 2061 else x.year
    return pd.to_datetime(datetime.date(year, x.month, x.day))


df['Yr_Mo_Dy'] = df['Yr_Mo_Dy'].apply(fix_century)

Ans = df.head(4)

 

 

Question 68

년도별 각컬럼의 평균값을 구하여라

ans = df.groupby(df.Yr_Mo_Dy.dt.year).mean()
ans.head(4)

 

 

Question 69

weekday컬럼을 만들고 요일별로 매핑하라 ( 월요일: 0 ~ 일요일 :6)

df['weekday'] = df.Yr_Mo_Dy.dt.weekday
Ans = df['weekday'].head(3).to_frame()
Ans

 

Question 70

weekday컬럼을 기준으로 주말이면 1 평일이면 0의 값을 가지는 WeekCheck 컬럼을 만들어라

 

df['weekcheck'] = df['weekday'].map(lambda x : 1 if x in [5,6] else 0)
Ans = df['weekcheck'].head(3).to_frame()
Ans

Question 71

년도, 일자 상관없이 모든 컬럼의 각 달의 평균을 구하여라

ans = df.groupby(df.Yr_Mo_Dy.dt.month).mean()
ans.head(4)

 

Question 72

모든 결측치는 컬럼기준 직전의 값으로 대체하고 첫번째 행에 결측치가 있을경우 뒤에있는 값으로 대채하라

df = df.fillna(method='ffill').fillna(method='bfill')
df.isnull().sum()

 

이 코드는 pandas 데이터프레임에서 결측치(누락된 데이터, 즉 NaN 값)를 처리하고, 결측치가 잘 처리되었는지 확인하는 과정입니다. 두 줄로 이루어진 코드를 단계별로 설명하겠습니다.

1. df = df.fillna(method='ffill').fillna(method='bfill')

이 줄은 결측치를 전방 채우기(ffill)와 후방 채우기(bfill) 방식으로 처리합니다.

  • fillna(method='ffill'):
    • ffill 또는 "forward fill" 방식은 결측치(NaN)가 있는 경우, 그 결측치 바로 앞에 있는 유효한 값을 채워 넣는 방식입니다.
    • 예를 들어, 데이터가 [1, NaN, NaN, 4]라면, ffill을 적용한 후에는 [1, 1, 1, 4]로 변환됩니다.
  • fillna(method='bfill'):
    • bfill 또는 "backward fill" 방식은 결측치 바로 뒤에 있는 유효한 값으로 결측치를 채우는 방식입니다.
    • 예를 들어, 데이터가 [1, NaN, NaN, 4]라면, bfill을 적용한 후에는 [1, 4, 4, 4]로 변환됩니다.

Question 73

년도 - 월을 기준으로 모든 컬럼의 평균값을 구하여라

Ans = df.groupby(df.Yr_Mo_Dy.dt.to_period('M')).mean()
Ans.head(3)

 

 

Question 74

RPT 컬럼의 값을 일자별 기준으로 1차차분하라

Ans = df['RPT'].diff()
Ans.head(3)

 

1차 차분은 연속된 시점 간의 차이를 계산하여 시계열 데이터를 변환하는 기법입니다. 주로 시계열 데이터에서 추세를 제거하거나 정상성을 확보하기 위해 사용되며, 데이터의 변화율과 변동성을 분석하는 데 유용합니다.

 

Question 75

RPT와 VAL의 컬럼을 일주일 간격으로 각각 이동평균한값을 구하여라

ans = df[['RPT','VAL']].rolling(7).mean()

.rolling(7)

  • rolling() 함수는 **이동 창(rolling window)**을 생성하는 함수입니다.
  • rolling(7)은 7개의 데이터씩 그룹화된 이동 창을 만들어 각 창의 값을 계산하도록 설정합니다. 여기서 7은 창의 크기를 의미하며, 7일 또는 7개의 데이터 단위로 계산을 하겠다는 뜻입니다.
  • 이동 창은 데이터를 순차적으로 겹치면서 계산되기 때문에, 첫 번째 7개의 데이터를 하나의 창으로 묶어 평균을 계산하고, 다음에는 한 칸씩 옮기며 다시 평균을 계산하는 방식입니다.

.mean()

  • mean() 함수는 각 이동 창의 평균 값을 계산합니다.
  • 7개의 데이터로 구성된 각 창에서 RPT와 VAL의 평균을 계산하여 새로운 값을 반환합니다

 

 

 

 

반응형