문제 설명
자세히 보기
분석하기 좋은 데이터…? 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, 실습까지
merge는 concat과 달리 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'을 입력하여 앞 행의 값으로 채울 수 있습니다.
value에 df.mean() 을 넣어 평균 값으로 채울 수도 있습니다.