Pandas - 전처리2

[참조] 패스트캠퍼스 - 직장인을 위한 파이썬 데이터분석 올인원 패키지 Online.

Series Type

df.info()
  • object: 일반 문자열
  • float: 실수
  • int: 정수
  • category: 카테고리
  • datetime: 시간

DataFrame은 Series의 집합이라고 볼 수 있으며 각 열(Series)의 타입 정보를 확인할 수 있다.

df['키'].dtypes

열 타입 정보를 확인할 수 있다.

df['키'].astype(int)

해당 열의 타입을 int형으로 변환이 가능하지만 NaN 데이터가 존재할 경우 변경이 불가능하기 때문에 fillna()로 데이터를 채워줄 필요가 있다.

datetime 타입

df['생년월일'] = pd.to_datetime(df['생년월일'])

날짜 데이터의 경우 to_datetime() 메서드를 이용해 날짜 형식으로 바꿀 수가 있다.

년도 데이터 추출

df['생년월일'].dt.year

월 데이터 추출

df['생년월일'].dt.month

일 데이터 추출

df['생년월일'].dt.day

추가로 hour, minute, second도 확인 가능하다.

요일 데이터 추출

df['생년월일'].dt.dayofweek
  • 월요일 ~ 일요일: 0 ~ 6 에 해당

해당 년도의 주(week) 데이터 추출

df['생년월일'].dt.weekofyear

apply

apply는 Series나 DataFrame에 좀 더 구체적인 로직을 적용하고 싶은 경우 활용한다.

함수를 정의하고 정의한 함수를 apply에 인자로 넘겨주는 방식으로 구현한다.

df.loc[df['성별'] == '남자', '성별'] = 1
df.loc[df['성별'] == '여자', '성별'] = 0

이와 같은 방식으로도 남자는 1로 여자는 0으로 지정할 수 있지만 종류가 많아지게 된다면 같은 작업을 여러 번 수행해야 한다.

apply 함수 정의

def male_or_female(x):
    if x == '남자':
        return 1
    elif x == '여자':
        return 0

함수를 정의하며 반드시 return 값이 존재하도록 한다.

apply 적용

df['성별_NEW'] = df['성별'].apply(male_or_female)

이와 같이 apply 메서드에 위에서 정의한 함수를 호출하여 사용한다.

DataFrame 전체에 대해서 연산해야 하는 경우

def cm_to_brand(df):
    value = df['브랜드평판지수'] / df['키']

    return value
df.apply(cm_to_brand, axis=1)

위의 경우처럼 열(Series) 단위로 연산하는 것이 아니라 DataFrame 전체에 대해서 연산해야 하는 경우 axis 옵션을 주어야한다.

lambda

lambda 함수라는 간단한 함수식을 적용해서 구현을 할 수도 있다.

f = lambda x: 1 if x == '남자' else 0
df['성별'].apply(f)
  • 값이 ‘남자’라면 1, 아니면 0 return
df['키/2'] = df['키'].apply(lambda x: x/2)

map

map을 이용해서 구현을 할 수도 있다.

my_map = {
    '남자': 1,
    '여자': 0
}

map은 딕셔너리 형태로 정의한다.

df['성별'].map(my_map)

DataFrame 산술연산

column 간의 연산

df = pd.DataFrame({'통계': [60, 70, 80, 85, 75], '미술': [50, 55, 80, 100, 95], '체육': [70, 65, 50, 95, 100] })
df['미술'] + df['체육']

+, -, *, /, % 과 같은 연산이 가능하다.

column과 숫자와의 연산

df['미술'] / 10

복합적 연산

df['통계미술합계'] = df['통계'] + df['미술'] + 10

axis 기준 연산

df.mean(axis=0)
df.sum(axis=1)

NaN 값이 있을 경우의 연산

연산에 NaN 값이 포함되어 있으면 결과 역시 NaN 이지만 mean()이나 sum() 같은 연산은 NaN 값을 무시, 마치 0처럼 취급하고 연산하여 결과를 반환한다.

DataFrame 간의 연산

df1 = pd.DataFrame({'통계': [60, 70, 80, 85, 75], '미술': [50, 55, 80, 100, 95], '체육': [70, 65, 50, 95, 100] })
df2 = pd.DataFrame({'통계': ['good', 'bad', 'ok' , 'good', 'ok'], '미술': [50, 60 , 80, 100, 95], '체육': [70, 65, 50, 70 , 100] })
df1 + df2

연산에 문자열 값이 포함되어 있으면 오류가 발생한다.

Column의 순서가 바뀌어 있는 경우

df1 = pd.DataFrame({'미술': [10, 20, 30, 40, 50], '통계':[60, 70, 80, 90, 100] })
df2 = pd.DataFrame({'통계': [10, 20, 30, 40, 50], '미술': [60, 70, 80, 90, 100] })
df1 + df2

pandas가 열의 이름을 자동으로 맞춰주어 연산을 해준다.

행의 갯수가 다른 경우

df1 = pd.DataFrame({'미술': [10, 20, 30, 40, 50, 60], '통계':[60, 70, 80, 90, 100, 110] })
df2 = pd.DataFrame({'통계': [10, 20, 30, 40, 50], '미술': [60, 70, 80, 90, 100] })
df1 + df2

행의 갯수가 다르면 NaN으로 처리하여 연산을 해준다.

select_dtypes

select_dtypes 메서드를 사용하게 되면 데이터 타입별 column을 선택할 수가 있다.

문자열이 있는 column만 선택

df.select_dtypes(include='object')

문자열이 아닌 숫자형 column만 선택

df.select_dtypes(exclude='object')
df.select_dtypes(exclude='object') + 10

산술 연산을 할 때 문자열이 있다면 에러가 발생하게 된다. 위 예시처럼 문자열이 담긴 column을 제외하고 숫자형 column에 연산을 하면 에러를 없앨 수가 있다.

원핫인코딩

원핫인코딩은 한가지 요소는 True, 나머지 요소는 False로 만들어 주는 기법을 말한다.

blood_map = {
    'A': 0, 
    'B': 1,
    'AB': 2, 
    'O': 3,
}

우선 혈액형의 데이터를 숫자로 변환하기 위해 딕셔너리 형태의 map을 정의한다.

df['혈액형_code'] = df['혈액형'].map(blood_map)
df['혈액형_code'].value_counts()

그림1

value_counts() 메서드는 데이터 개수를 반환해주는데 이 데이터를 그대로 머신러닝으로 예측을 하게되면 B형(1) + AB형(2) = O형(3)이라는 잘못된 관계를 도출해 낼 수가 있다.

각각 4개의 별도 column을 형성하고 한 column에는 True 나머지에는 모두 False를 넣어주어 독립적인 관계라는 것을 표현하는 것을 원핫 인코딩이라고 한다.

df['혈액형_code']

그림2

pd.get_dummies(df['혈액형_code'])

그림3

pd.get_dummies(df['혈액형_code'], prefix='혈액형')

prefix를 설정해서 혈액형_0, 혈액형_2, … 으로 표현이 가능하다.

[참조] 패스트캠퍼스 - 직장인을 위한 파이썬 데이터분석 올인원 패키지 Online.

끝!