본문 바로가기
데이터 분석 및 업무 자동화

파이썬 판다스 활용한 데이터 전처리 핵심 요약

by 공부머리 2022. 2. 16.
반응형

파이썬 판다스를 활용하면 데이터 전처리를 효율적으로 할 수 있습니다. 오늘은 파이썬 판다스를 활용한 데이터 전처리 기능에 대해서 정리해 보도록 하겠습니다.


결측 값 채우기 (fillna)

fillna() na값에 대하여 fill해주는 함수입니다. 아래 코드는 누락된 데이터를 -1로 채우는 코드입니다.

df['키'].fillna(-1)

NaN값을 채워준 다음 유지시키려면 inplace=True 옵션을 주거나, fillna로 채워 준 값을 다시 대입해 주어야 합니다. fillna로 채워준 값을 다시 대입해 주는 방식을 추천드립니다.

df2['키'].fillna(-1, inplace=True)
df2['키'] = df2['키'].fillna(-1)

산술 통계의 값을 na값에 대해서도 넣어줄 수 있습니다.

height = df2['키'].sum()
df2['키'] = df2['키'].fillna(height)

결측값 제거 (dropna)

dropna()는 행에 결측치가 하나라도 있으면 해당행을 제거합니다.

df = df.dropna()

dropna()는 몇가지 옵션을 추가할 수 있습니다. axis=0은 행을 제거합니다. axis=1은 열을 제거합니다. 'any'는 결측치가 하나라도 있는 경우 제거하고, 'all'은 결측치가 모두 NaN일 경우 제거합니다.

df = df.dropna(axis=0)
df = df.dropna(axis=1)
df = df.dropna(axis=0, how='any')
df = df.dropna(axis=0, how='all')

중복된 값 제거 (drop_duplicates)

column의 중복 값 제거. 열에 중복된 값이 있을 때 첫 번째의 값은 유지시키고 뒤에 오는 값들을 제거합니다. NaN값도 중복된 값으로 판단하고 중복 값 제거가 됩니다.

df['키'].drop_duplicates()

keep='first' 또는 keep='last' 옵션으로 유지하고 싶은 데이터를 설정할 수 있습니다.

df['키'] = df['키'].drop_duplicates(keep='last')

df뒤에 drop_duplicate를 적용 후 괄호안에 열 이름을 적어주면 괄호 안의 열의 값이 중복된 값이 있으면 해당하는 행전체를 제거합니다.

df = df.drop_duplicates('그룹')

 마찬가지로 keep='last' 옵션을 주어서 마지막 데이터를 남기고 제거하는 설정을 할 수 있습니다.

df = df.drop_duplicates('그룹', keep='last')

행과 열의 제거 (drop)

drop()을 활용하여 열을 제거할 수 있습니다. 열을 제거할 때는 axis=1 옵션을 줍니다. 복수의 열을 제거하고자 할 때는 list로 지정합니다.

df.drop('그룹', axis=1)
df.drop(['그룹', '소속사'], axis=1)

drop()을 활용하여 행을 제거할 수 있습니다. 행을 제거할 때는 제거하고자하는 인덱스와 axis=0 옵션을 줍니다. 복수의 행을 제거하고자 할 때는 list로 지정합니다.

df.drop(3, axis=0)
df.drop([3, 5], axis=0)

DataFrame 합치기 (concat)

row에 합칠 때는 pd.concat에 합칠 데이터프레임을 list로 합쳐줍니다. row 기준으로 합칠 때는 sort=False 옵션을 주어 순서가 유지되도록 합니다.

df_concat = pd.concat([df, df_copy], sort=False)

index가 꼬이니 reset_index()로 인덱스를 초기화 해줄 수 있습니다. 하지만 index라는 colume이 추가됩니다. drop=True 옵션으로 새로운  index column이 생성되지 않도록 만들어 줍니다.

df_concat.reset_index()
df_concat.reset_index(drop=True)

column 기준으로 합치고자 할 때는 axis=1 옵션을 부여합니다. 인덱스를 기준으로 합치기 때문에 행의 개수가 맞지 않을 때는 인덱스가 빠져있는 행은 NaN의 값으로 합쳐집니다.

df_concat = pd.concat([df, df2], axis=1)

DataFrame 병합하기 (merge)

merge는 특정 고유한 키값을 기준으로 병합합니다. left와 right의 자리에는 병합할 두 데이터프레임을 대입합니다. on의 자리에는 병합의 기준이 되는 열을 넣어 줍니다. how에는 'left', 'right', 'inner', 'outer'라는 4가지의 병합 방식 중 한 가지를 택합니다.

pd.merge(left, right, on='기준column', how='left')

'left'옵션을 부여하면 왼쪽 데이터프레임에 키 값이 존재하면 해당 데이터를 유지하고, 병합한 오른쪽 데이터프레임의 값은 NaN이 대입됩니다. 'right'옵션을 부여하면 오른쪽 데이터프레임을 기준으로 병합하게 됩니다.

pd.merge(df, df_right, on='이름', how='left')
pd.merge(df, df_right, on='이름', how='right')

'inner' 옵션을 부여하면 두 데이터프레임에 모두 키 값이 존재하는 경우만 병합합니다. 'outer'옵션을 부여하면 하나의 데이터프레임에 키 값이 존재하는 경우 모두 병합합니다. 'outer' 옵션에서 없는 값은 NaN으로 대입됩니다.

pd.merge(df, df_right, on='이름', how='inner')
pd.merge(df, df_right, on='이름', how='outer')

column명은 다르지만, 동일한 성질의 데이터인 경우는 left_on, right_on 옵션을 사용합니다.

pd.merge(df, df_right, left_on='이름', right_on='성함', how='left')

Type 변환하기

데이터의 type에는 아래와 같은 type이 있습니다. 데이터타입은 df.info()를 실행하면 확인할 수 있습니다.

  • object : 일반 문자열 타입
  • float : 실수
  • int : 정수
  • category : 카테고리
  • datetime : 시간

type을 변환하기 위해서는 astype이라는 메소드를 사용합니다. type변환은 series별로 진행합니다. NaN값이 들어가 있으면 정수형으로 변환되지 않기 때문에 fillna로 채워준 후에 int로 type 변환을 해야 합니다.

df['키'].astype(int)

시간을 다루는 datetime 타입

날짜를 변환하기 위해서는 판다스 메소드인 to_datetime이라는 메소드를 사용합니다.

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

datetime 타입으로 변환해준 데에는 중요한 이유가 있습니다. 매우 손쉽게 월, 일, 요일 등의 날짜 정보를 세부적으로 추출해낼 수 있습니다. datetime의 약어인 'dt'에는 다양한 정보들을 제공해 줍니다.

df['생년월일'].dt.year
df['생년월일'].dt.month
df['생년월일'].dt.day
df['생년월일'].dt.hour
df['생년월일'].dt.minute
df['생년월일'].dt.second
df['생년월일'].dt.dayofweek
df['생년월일'].dt.weekofyear

df['생일_월'] = df['생년월일'].dt.month #이런식으로 month열을 추가하여 활용

apply

apply는 시리즈나 데이터프레임에 좀 더 구체적인 로직을 적용하고 싶은 경우 활용합니다. apply를 적용하기 위해서는 함수가 먼저 정의되어야 합니다. apply는 정의한 로직 함수를 인자로 넘겨줍니다.

 

시리즈를 넘겨받을 때는 아래와 같은 코드를 적용합니다. 아래 코드를 실행하면 남자는 1 여자는 0의 값을 가진 '성별_new'이라는 열이 추가됩니다.

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

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

데이터프레임 전체를 넘겨받을 때는 아래와 같은 코드를 적용합니다. axis=1 옵션을 적용해주어야 합니다.

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

df.apply(cm_to_brand, axis=1)

lambda

lambda는 1줄로 작성하는 간단한 함수 식입니다. return을 별도로 명기하지 않습니다.

df['성별'].apply(lambda x:1 if x == '남자' else 0)

실제로는 간단한 계산식을 적용하려는 경우에 많이 사용합니다.

df['키/2'] = df['키']apply(lambda x : x / 2)

map

map은 딕셔너리 형태로 정의합니다. map이라는 함수를 사용하여 값을 매핑합니다.

my_map = {'남자':1', '여자:0'}
df['성별'].map(my_map)

데이터프레임의 산술 연산

column과 column과의 산술 연산은 사칙연산 부호를 사용하여 가능합니다. (+, -, *, /, %)

df['통계'] + df['미술']
df['통계'] - df['미술']
df['통계'] * df['미술']
df['통계'] / df['미술']
df['통계'] % df['미술']

column과 숫자 간의 산술 연산도 사칙연산 부호를 사용하여 가능합니다. (+, -, *, /, %)

df['통계'] + 10
df['통계'] - 10
df['통계'] * 10
df['통계'] / 10
df['통계'] % 10

mean(), sum()을 axis 기준으로 연산 가능합니다.

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

select_dtypes

문자열이 포함되어 있는 열들만 뽑아내거나 문자열이 아닌 숫자형인 열들만 뽑아낼 때 select_dtypes 메소드를 사용하고 'include='object' 또는 'exclude='object' 옵션을 적용합니다.

obj_cols = df.select_dtypes(include='object')
num_cols = df.select_dtypes(exclude='object')

숫자형인 열들만 산술 통계를 낼 때 사용되기도 합니다.

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

get_dummies (원핫인코딩)

원핫인코딩은 머신러닝에서 필수적인 기능입니다. 한 개의 요소는 True 그리고 나머지 요소는 False로 만들어 주는 기법입니다.

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

이상으로 파이썬 판다스를 활용한 데이터 전처리 기능에 대한 핵심요약정리 마치겠습니다.

반응형

댓글