3. 분석하기 좋은 데이터 만들기 (1)

문제 설명

자세히 보기

분석하기 좋은 데이터…? Tidy Data

분석하기 좋은 데이터란?
말 그대로 데이터 집합을 분석하기 좋은 형태로 만들어놓은 것입니다.
다음의 조건을 만족하여야 합니다.
데이터 분석 목적에 맞는 데이터를 모아 새로운 표(Table)를 만들어야 한다.
측정한 값은 행(row)을 구성해야 한다.
변수는 열(column)로 구성해야 한다

데이터프레임 연결하기

데이터프레임을 연결하는 메소드입니다.
pandas.concat([DATA_FRAME_1, DATA_FRAME_2, ...])
Python
복사
예시들입니다.
import pandas df1 = pd.DataFrame({'a':['a0','a1','a2','a3'], 'b':['b0','b1','b2','b3'], 'c':['c0','c1','c2','c3']}, index = [0,1,2,3]) df2 = pd.DataFrame({'a':['a2','a3','a4','a5'], 'b':['b2','b3','b4','b5'], 'c':['c2','c3','c4','c5'], 'd':['d2','d3','d4','d5']}, index = [2,3,4,5])
Python
복사
둘의 출력 결과입니다. a b c 0 a0 b0 c0 1 a1 b1 c1 2 a2 b2 c2 3 a3 b3 c3 a b c d 2 a2 b2 c2 d2 3 a3 b3 c3 d3 4 a4 b4 c4 d4 5 a5 b5 c5 d5
Python
복사
두 DataFrame은 행인덱스와 열인덱스가 다른 상황입니다.
df3 = pandas.concat([df1, df2])
Python
복사
출력 결과입니다. a b c d 0 a0 b0 c0 NaN 1 a1 b1 c1 NaN 2 a2 b2 c2 NaN 3 a3 b3 c3 NaN 2 a2 b2 c2 d2 3 a3 b3 c3 d3 4 a4 b4 c4 d4 5 a5 b5 c5 d5
Python
복사
axios 옵션의 기본값이 0이므로 행방향(위아래)로 데이터를 붙였습니다.
그러나 df1의 경우 d열이 없기에 NaN이 채워졌습니다.
ignore_index = True옵션을 사용하면 인덱스 재배열이 가능합니다.
df4 = pandas.concat([df1, df2], ignore_index=True)
Python
복사
a b c d 0 a0 b0 c0 NaN 1 a1 b1 c1 NaN 2 a2 b2 c2 NaN 3 a3 b3 c3 NaN 4 a2 b2 c2 d2 5 a3 b3 c3 d3 6 a4 b4 c4 d4 7 a5 b5 c5 d5
Python
복사
axios = 1 옵션을 줘보겠습니다.
df5 = pandas.concat([df1, df2], axios=1)
Python
복사
# bold 처리된 부분은 인덱스가 겹쳐 abc와 abcd에 모두 데이터가 있는 것입니다 a b c a b c d 0 a0 b0 c0 NaN NaN NaN NaN 1 a1 b1 c1 NaN NaN NaN NaN 2 a2 b2 c2 a2 b2 c2 d2 3 a3 b3 c3 a3 b3 c3 d3 4 NaN NaN NaN a4 b4 c4 d4 5 NaN NaN NaN a5 b5 c5 d5
Python
복사
inner는 교집합, outer는 합집합니다.
기본값은 outer이므로 inner 옵션을 줘보겠습니다.
df6 = pd.concat([df1, df2], axis=1, join='inner')
Python
복사
a b c a b c d 2 a2 b2 c2 a2 b2 c2 d2 3 a3 b3 c3 a3 b3 c3 d3
Python
복사
양쪽 값이 모두 존재하는 2번, 3번 인덱스만 남은 걸 보실 수 있습니다.

Merge, 실습까지

mergeconcat과 달리 inner 옵션이 default이며, 이 외에도 다음 옵션들의 적용이 가능합니다.
left 왼쪽 테이블 기준 join
right 오른쪽 테이블 기준 join
inner 교집합
outer 합집합
데이터프레임이 2개인 경우만 join할 수 있습니다.
“특정 공통열”을 기준으로 나머지를 join할 때 편리합니다.
user_df_0 = pandas.DataFrame({ 'userId': [0, 1, 2, 3, 4, 5, 6], 'userName': ['이름0', '이름1', '이름2', '이름3', '이름4', '이름5', '이름6'], 'phone': ['0100000000', '01011111111', '01022222222', '01033333333', '01044444444', '01055555555', '01066666666'], 'email': ['00email@email.com', '11email@email.com', '22email@email.com', '33email@email.com', '44email@email.com', '55email@email.com', '66email@email.com'], 'githubId': ['', '', '', 'GitHId3', 'GitHId4', '', 'GitHId6'] }) user_df_1 = pandas.DataFrame({ 'userSeq': [0, 1, 2, 3, 4, 5, 6], 'nickName': ['이름0', '이름1', '이름2', '이름3', '이름4', '이름5', '이름6'], 'isPremium': [True, False, True, False, True, True, False] 'advPermission': [False, True, False, False, True, True] 'paid': [32000, 0, 6300, 0, 8200, 60000, 0] })
Python
복사
userId userName phone email githubId 0 0 이름0 01000000000 00email@email.com 1 1 이름1 01011111111 11email@email.com 2 2 이름2 01022222222 22email@email.com 3 3 이름3 01033333333 33email@email.com GitHId3 4 4 이름4 01044444444 44email@email.com GitHId4 5 5 이름5 01055555555 55email@email.com 6 6 이름6 01066666666 66email@email.com GitHId6 userSeq nickName isPremium advPermission paid 0 0 이름0 True False 32000 1 1 이름1 False True 0 2 2 이름2 True False 6300 3 3 이름3 False False 0 4 4 이름4 True True 8200 5 5 이름5 True True 60000 6 6 이름6 False False 0
Python
복사
pandas.merge(df1, df2) # 같은 index 행이 없기 때문에 에러가 발생합니다. # pandas.errors.MergeError: No common columns to perform merge on. Merge options: left_on=None, right_on=None, left_index=False, right_index=False
Python
복사
pandas.merge(user_df_0, user_df_1, left_on='userId', right_on='userSeq') # Base 행을 직접 지정하여 맞춰줍니다. userId userName phone email githubId userSeq nickName isPremium advPermission paid 0 0 이름0 01000000000 00email@email.com 0 이름0 True False 32000 1 1 이름1 01011111111 11email@email.com 1 이름1 False True 0 2 2 이름2 01022222222 22email@email.com 2 이름2 True False 6300 3 3 이름3 01033333333 33email@email.com GitHId3 3 이름3 False False 0 4 4 이름4 01044444444 44email@email.com GitHId4 4 이름4 True True 8200 5 5 이름5 01055555555 55email@email.com 5 이름5 True True 60000 6 6 이름6 01066666666 66email@email.com GitHId6 6 이름6 False False 0
Python
복사

Reference

누락되는 값 처리하기

fillna를 활용하여 처리합니다.
아예 제거를 해주거나, 특정 값으로 채워주거나 등의 선택지가 있습니다.
결측값을 확인하기 위해 isnull()isnull().sum() 등을 활용합니다.
결측값이 포함된 행을 제거하기 위해서는 dropna() 를 사용합니다.
행을 제거하기 위해서는 axis 인자에 0을, 열을 제거하기 위해서는 1을 입력합니다.
결측값을 대체하기 위해서는 fillna(value)를 입력합니다.
method='ffill'을 입력하여 뒷 행의 값으로 채울 수 있습니다.
method='bfill'을 입력하여 앞 행의 값으로 채울 수 있습니다.
valuedf.mean() 을 넣어 평균 값으로 채울 수도 있습니다.