파이썬 판다스를 활용하면 데이터 전처리를 효율적으로 할 수 있습니다. 오늘은 파이썬 판다스를 활용한 데이터 전처리 기능에 대해서 정리해 보도록 하겠습니다.
결측 값 채우기 (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'])
이상으로 파이썬 판다스를 활용한 데이터 전처리 기능에 대한 핵심요약정리 마치겠습니다.
'데이터 분석 및 업무 자동화' 카테고리의 다른 글
태블로(TABLEAU) 소개, 최고의 데이터시각화 툴 (0) | 2022.02.23 |
---|---|
MySQL 규칙 만들기 방법 - IF, CASE, CREATE FUNCTION (0) | 2022.02.21 |
Python Pandas 핵심 요약 - pivot_table, groupby, 시각화 (0) | 2022.02.14 |
파이썬 판다스 기능 핵심 요약 - 파일 읽어오기, 통계값, 색인 (0) | 2022.02.09 |
비전공 직장인의 파이썬 독학 - 조건문과 반복문 (0) | 2022.02.07 |
댓글