데이터프레임 합치기에 대해 비전공자도 쉽게 이해하도록 설명하겠습니다.
저는 파이썬을 잘 몰랐던 비전공자입니다.
파이썬을 설명해주는곳은 학교나 온라인플랫폼이나 모두 저같은 저지능(?)에게는 불친절하더군요.
그래서 저처럼 기초적인 분들이 쉽게 접근할 수 있도록 제가 이해한 기반으로 설명하고자 합니다.
이번 글에서는 파이썬 판다스 기능 중 데이터프레임 합치는 방법에 대해서 알아볼겁니다.
파이썬 판다스는 파이썬의 라이브러리 중에서 데이터 전처리를 위한 유용하고 인기있는 라이브러리입니다.
쉽게 생각하면 엑셀로 데이터를 조작하는 방식이라 보시면 되는데요.
다만 엑셀은 데이터 양이 너무 많아지면 수용하기 힘들다는 단점이 있습니다.
이를 보완하기 위해 데이터분석가들은 파이썬의 판다스를 통해서 데이터 정제작업을 합니다.
판다스의 다양한 기능 중에서 이번에 다뤄볼 내용은 병합하는 내용입니다.
즉 어떤 데이터프레임(테이블 형태)들끼리 합치고 싶을 때 써야 하는 방법이죠.
pandas에서는 크게 3가지의 방법을 사용해볼 수 있습니다.
- merge
- concat
- join
이번 파트에서는 merge에 대해서 다뤄봅시다.
merge는 말그대로 병합의 의미를 갖습니다.
영어에서는 merge가 회사의 합병을 의미하지만,
데이터 측면에서는 두 데이터프레임이나 테이블을 가로 혹은 세로에 붙이는 느낌인데요.
merge는 특정 key값을 기준으로 병합합니다.
즉, 두 개의 데이터프레임이 존재하는 경우 동일한 이름을 가진 컬럼에 대해서 붙인다는 말이죠.
파이썬 실습
실제 파이썬 코드를 통해서 구현해보겠습니다.
우선 pandas 라이브러리를 호출하여 pd라는 이름으로 지정합니다.
import pandas as pd
merge로 연결시키기에 앞서서, 데이터프레임을 2개 생성해보겠습니다.
dataframe_first = pd.DataFrame({'id':[10,11,12,13,14],
'python':[1,2,3,4,5],
'C':[2,3,4,5,6],
'C++':[2,3,4,1,2]})
dataframe_second = pd.DataFrame({'id':[10,11,12,13,14],
'java':[5,2,3,3,1],
'javascript':[1,3,2,1,4],
'Php':[1,3,2,0,0]})
두 데이터프레임을 병합하는 merge를 사용하는 방법은 간단합니다.
아래 중 한 가지의 편한 방법을 사용하시면 됩니다.
그러나 방법1의 경우에는 merge() 괄호 안에 들어간 데이터프레임이 주인공(기준)과 같이 됩니다.
그러므로 저는 방법2를 조금 더 선호합니다.
# 방법1
dataframe_first.merge(dataframe_second)
# 방법2
pd.merge(dataframe_first, dataframe_second)
결과는 두 방법 동일하게 5행 5열이 나옵니다.
merge의 기본 조인 옵션
merge의 기본적인 설정은 inner join의 방법을 따릅니다.
위의 merge의 경우에는 'id' 컬럼의 값들이 동일하게 채워져 있기 때문에 merge 전과 후가 동일하게 5X5의 형태로 나타난겁니다.
key로 설정된 동일한 컬럼 이름(위에서는 'id')의 값이 교집합이 되는 부분이 없다면, 결과에 나타나지 않습니다.
inner join 예시
예를 들어서 하나의 데이터 프레임을 더 만들어볼게요.
새로 만드는 데이터프레임 값은 id의 값이 위의 데이터프레임들과 조금 다릅니다. (id값 중 17, 18을 주목)
# id 값 중 뒷 부분이 기존의 데이터프레임과 다름
dataframe_third = pd.DataFrame({'id':[10,11,12,17,18],
'html':[1,2,3,4,5],
'css':[5,4,3,2,1],
'go':[1,3,2,4,2]})
세번째로 생성된 데이터프레임과 두번째의 데이터프레임을 merge 시켜보겠습니다.
dataframe_third.merge(dataframe_second)
첫번째, 두번째 데이터프레임을 merge한 5X5의 결과물과 조금 다른게 느껴지시나요?
이것이 merge가 기본으로 inner join의 설정을 갖고 있다는 것을 의미합니다.
merge의 옵션
다행히도 우리는 편의에 맞게 이 옵션을 조절할 수 있습니다.
left기준, right기준, inner기준(default), outer기준으로 4가지 중 하나를 고를 수 있습니다.
해당 옵션은 merge()라는 괄호 안에 넣어주면 되는데요.
지금부터는 이 괄호 안에 넣을 수 있는 파라미터들을 간략히 설명하겠습니다.
merge의 옵션은 아래와 같습니다. (정말 많습니다)
- how
- on
- left_on
- right_on
- left_index
- right_index
- sort
- suffixes
- copy
- indicator
- validate
그러나 이 모든 기능을 외울 필요는 없습니다.
데이터프레임을 병합하는 과정에서는 핵심적인 옵션은 몇개 없습니다.
저희는 이 중
- how
- on
- left_on
- right_on
에 대해서만 짚고 넘어가겠습니다.
merge의 파라미터 - how
how는 병합할 기준을 정하는 겁니다.
크게 4가지 방법이 있습니다.
left, right, outer, inner(default)
이 중 저 위에서 설명한 대로 inner가 기본으로 설정되어 있습니다.
즉, 기준이 되는 컬럼에서(key 컬럼, 여기서는 'id') dataframe1에는 있고, dataframe2에는 없는 행은 배제시키고 나타냅니다.
left는 merge를 입력했을 때 좌측에 입력한 데이터프레임을 의미합니다.
right는 merge한 둘 중 오른쪽에 입력한 데이터프레임이고요.
left와 right의 경우에는 지정한 열의 값만 보여집니다.
outer는 inner의 반대되는 개념이라고 보시면 됩니다.
inner가 교집합이라면 outer는 합집합인 셈이죠.
즉, 두 데이터프레임의 값이 다르거나 맞지 않더라도 Nan으로 표시하면서 행X열 수를 맞춰줍니다.
merge기능 중 how의 예시
복잡한 설명보다 예시로 갈게요.
pd.merge(dataframe_second, dataframe_third, how='outer')
두 데이터프레임을 outer 방법으로 merge를 시키면 모든 데이터프레임 값이 나오게 됩니다.
second는 id값이 17, 18이 없었고, thrid는 13, 14가 없었음에도 불구하고 모든 id값을 써주면서 값을 보여줍니다.
물론 각각의 없는 값들은 NaN으로 표현됩니다.
merge의 파라미터 - on
merge에서 다룰 다음 파라미터는 on입니다.
on은 기준 열(column)을 의미합니다.
해당 기준을 가지고 merge를 할 것입니다.
on의 값을 지정해주지 않는다면, 동일한 이름을 갖는 두 데이터프레임의 컬럼을 기준으로 지정합니다.(기본값)
그러면 만약에 두 데이터프레임의 기준이 되는 컬럼의 이름이 서로 다르다면요?
이때를 위해서 left_on, right_on 이라는 merge의 옵션이 있는겁니다.
merge의 파라미터 - left_on, right_on
left_on, right_on은 두 데이터프레임의 기준 열 이름이 다를시에 같은 기준으로 묶을 수 있는 역할을 합니다.
예를 들어 개인정보 데이터를 갖는 두가지 데이터프레임이 있다고 가정해봅시다.
A 데이터프레임은 개인의 이름을 '이름' 이라고 지정하였는데,
B 데이터프레임은 개인의 이름을 '성함' 이라고 지정하였습니다.
두 column은 동일한 값을 가짐에도 불구하고, column 이름이 다르기 때문에 기준을 잡기 힘듭니다.
이럴 경우 left_on='이름', right_on='성함' 으로 merge()의 옵션을 지정해줍니다.
left_on, right_on 코드 예시
아래의 예시는 pandas 공식문서의 예시를 가져왔습니다.
df1 = pd.DataFrame({'lkey': ['foo', 'bar', 'baz', 'foo'],
'value': [1, 2, 3, 5]})
df2 = pd.DataFrame({'rkey': ['foo', 'bar', 'baz', 'foo'],
'value': [5, 6, 7, 8]})
df1.merge(df2, left_on='lkey', right_on='rkey')
보시다시피 lkey와 rkey를 기준으로 데이터프레임을 병합(merge)하였습니다.
두 lkey와 rkey는 같은 값이므로, 나중에 데이터 전처리 작업을 할 때 둘 중 하나를 제거하는 방식으로 활용하면 됩니다.
여기서 재밌는 것은 나머지 컬럼이었던 value라는 각각의 컬럼들이 이름이 동일하기 때문에 병합직후에 따로 설정을 안해줬는데도 _x, _y라는 이름이 컬럼이름에 추가로 붙었다는 점입니다.
편리하게도 _x와 _y도 맘에 안든다면 merge() 옵션 중 suffixes 라는 옵션을 통해서 직접 붙힐 이름을 정할 수도 있습니다.
저희는 오늘 파이썬의 판다스 중 merge의 기능과 핵심적인 옵션 파라미터에 대해서 배웠습니다.
merge는 데이터프레임을 합치는 기능이며 다양한 옵션 파라미터가 있습니다.
특히 key column을 지정하는 것이 중요한데 이에 대한 부분은 반드시 숙지하시기 바랍니다.
이어서 다른 병합기법인 concat, join에 대해서 설명하겠습니다.
'파이썬 & 인공지능 > pandas library' 카테고리의 다른 글
파이썬 판다스 데이터프레임 예제 반드시 알아야 하는 함수들, python pandas Series and DataFrame # 1 (0) | 2020.12.03 |
---|---|
Python Numpy array, Pandas series, DataFrame 합치기 - numpy concatenate, pandas concat (0) | 2020.11.23 |
python pandas bug! int boolean bug! 판다스 버그 발견! (0) | 2020.04.14 |
파이썬 판다스 컬럼 이름 변경하기, df.columns=[], rename(columns={}), rename 함수 (0) | 2020.04.14 |
파이썬 판다스 데이터프레임 정렬 방법 sort_values() (0) | 2020.04.13 |