[proDS] 데이터 전처리 : 파생변수 생성

Gammi·2022년 11월 23일
0

proDS

목록 보기
8/13

📚 파생변수


  • 기존 변수를 조합하여 만들어내는 새로운 변수



✔ where()


  • numpy 객체의 메서드

  • 조건에 따라 두 개를 출력하는 메서드

  • if() 함수 대체 가능

  • True일 때 반환값, False일 때 반환값 차례대로 기입


import pandas as pd
import numpy as np

df = pd.read_csv("iris.csv")

df["is_setosa"] = df.where(df["Species"] == "setosa", 1, 0)
# df에 is_setosa라는 새로운 컬럼을 만들 건데
# Species 컬럼 값이 setosa이면 값으로 1을 저장하고 아니면 0



✔ crosstab


⭐ 입력

pd.crosstab(df["Species"], df["is_setosa"])

📌 출력

  • 위와 같은 그림 출력됨



✔ rename()


  • 데이터프레임 변수명 변경 시 사용

  • columns 인자에 기존 변수명과 신규 변수명의 쌍을 딕셔너리로 구성하여 입력


df = df.rename(columns = {"Sepal.Length" : "SL"})



✔ apply()


  • row 또는 coulmn 방향으로 일괄 계산

  • axis 인자 설정으로 연산 방향 설정 가능

    -> axis = 0 : columns 방향

    -> axis = 1 : row 방향


bike = pd.read_csv("bike.csv")

bike_sub = bike.iloc[:4 , 9:11]
# 행은 4 미만으로 , 0~3번 인덱스 뽑고
# 열은 9에서 11미만, 9번 ,10번 인덱스 출력
    
bike_sub.apply(func = sum)
# 아무것도 안 적으면 기본은 컬럼 방향 연산임!
bike_sub.apply(func = sum, axis=1)
# 로우 기준으로 계산

bike_sub.apply(func = pd.Series.mean)
# 평균 계산하고 싶으면 이렇게 해야함
# apply 자체에 내장 함수로 mean이 없기 때문에
# pandas 객체의 Series에서 불러와야 함



✔ astype()


  • 시리즈의 속성 변경 시 사용

  • int / float / str


bike_sub["casual"]
# 정수 타입임

bike_sub["casual"].astype("str") + "대"
# 출력하면 숫자 뒤에 대 붙어서 나옴
# object 타입으로 변환되기는 했으나 더 상위클래스라서 상관없는 듯...



✔ slice()


  • 원하는 번호의 인덱스 추출

bike["datetime"]
# 2011-01-01 01:00:00 이런 식으로 데이터 프레임 나옴

bike["datetime"].str.slice(0,4)
# 2011 출력됨
# 0에서 3번 인덱스까지 출력
bike["datetime"].str.slice(5,7)
# 01 나옴 월 출력

bike_time = pd.to_datetime(bike["datetime"][:3])
# datetime 타입으로 바꾸는 거 to_datetime()

bike_time.dt.year
# 년도 출력됨
bike_time.dt.hour
# 시분초 중에 시만 출력됨 
bike_time.dt.month
# 월 출력됨
bike_time.dt.weekday
# 요일 출력됨
# 0~1까지 숫자로 리턴되는데 0이 월요일이고 6이 일요일임
bike_time.dt.date
# 시간 뺀 년월일 출력
bike_time.dt.day
# 일 정보 출력됨



✔ get_dummies()


  • 가변수 생성 도와주는 함수

  • coulmns 인자에 명목형 변수 지정 및 처리 가능

  • drop_first 인자에 True 입력하면 첫 번째 컬럼 삭제됨


bike_dum = pd.get_dummies(data = bike, columns=["season"])
# 꼭 columns 값 [] 로 묶기
# 이렇게 하면 season 컬럼에 값이 1,2,3,4 있었는데
# season1, season2, season3, season4 컬럼 생기고
# 해당하는 값에 1 들어가 있음

bike_dum = pd.get_dummies(data = bike, columns=["season"], drop_first = True)
# season1 빼고 2부터 4까지 컬럼 생김





  1. temp 변수와 atemp 변수 차이의 절대값 평균은?
bike["diff"] = bike["temp"] - bike["atemp"]
# diff 특정값의 차이 구할 때 많이 쓰는 변수명임

bike["diff"].abs().mean()
# abs()는 절대값 구하는 메서드



2 .casual 값의 최대값이 25가 넘은 날은 총 며칠인가?

bike["datetime"] = pd.to_datetime(bike["datetime"])
# datetime으로 형변환
bike["date"] = bike["biketime"].dt.date
# 시간 빼고 날짜만 보이게 함

bike_agg = bike.groupby("date")["casual"].max() > 25
# 날짜별로 최대값을 뽑는데 그 값이 25보다 큰 것만 출력

bike_agg.sum()
# true, false로 리턴되기 때문에 sum()으로 더하면 true값만 출력됨



  1. 시간대별 registered 평균을 산출했을 때 값이 가장 큰 시간은?
bike["datetime"] = pd.to_datetime(bike["datetime"])
# datetime으로 형변환
bike["hour"] = bike["datetime"].dt.hour
# 시간만 필요하니까 시간만 보이게 출력

bike_hour = bike.groupby("hour")["registered"].mean().reset_index()
# 평균 계산해서 제일 큰 값 찾으면 되는데 시험에는 찾을 수가 없음

# 데이터 너무 많아서...
bike_hour.loc[bike_hour["registered"] == bike_hour["registered".max(),]
profile
개발자가 되었어요⭐️

0개의 댓글