데이터 전처리 하는 과정에서 두 개 이상의 데이터프레임을 하나의 데이터프레임으로 병합해야 하는 경우가 있다. 이 때 크게 두 가지 방법을 사용할 수 있는데 첫번째는 Concat을 사용하는 것이고 두번째는 Merge를 사용하는 것이다. 두 경우를 모두 살펴보자.
concat은 pandas의 함수이기 때문에 우선 pandas를 import 해줘야한다.
concat은 2개 이상의 데이터프레임을 병합할 때 사용한다. concat을 사용할 때 몇 가지 경우가 나뉘는데 컬럼명이 같거나 다른 경우, 인덱스가 중복인 경우 각각 사용해야하는 파라미터가 있으니 주의하도록 하자.
컬럼명이 같은 경우를 살펴보기 위해 두 개의 데이터프레임을 생성해보자.
# Column name이 같은 경우
# Column name이 같은 경우
df1 = pd.DataFrame({'col1' : ['사과', '배', '감', '수박', '메론'],
'col2' : [500, 1000, 2500, 5000, 3000]}, index=[0,1,2,3,4])
df2 = pd.DataFrame({'col1' : ['수박', '메론', '딸기', '키위', '오렌지'],
'col2' : [5000, 3000, 1000, 600, 700]}, index=[3,4,5,6,7])
concat을 사용하여 데이터프레임을 병합하기 전에 aixs 파라미터의 의미를 알아야한다.
- aixs=0(default) : row level로 병합
- aixs=1 : column level로 병합
# column level
pd.concat([df1,df2],axis=1)
# row level(default)
pd.concat([df1,df2], axis=0)
aixs 파라미터를 지정해줌으로써 원하는 방향으로 데이터프레임을 병합할 수 있다.
데이터프레임을 병합하면 row level로 병합한 예시처럼 인덱스가 중복되는 경우가 있다. 인덱스를 보면 3, 4, 3, 4로 중복되어있는 것을 확인할 수 있는데 이 때 알아야할 것이 concat의 'ignore_index' 파라미터다.
ignore_index : 기존 인덱스를 유지하거나 무시
- False: 기존 인덱스 유지(default)
- True: 기존 인덱스 무시(인덱스 재배열)
pd.concat([df1, df2], ignore_index=True)
# index를 순서대로 재배열
ignore_index = True로 지정하니 인덱스가 순서대로 재배열된 것을 확인할 수 있다.
컬럼명이 다른 두 개의 데이터프레임을 생성해보자.
df3 = pd.DataFrame({'item':['item0', 'item1', 'item2'],
'count':['count0', 'count1', 'count2'],
'price':['price0', 'price1', 'price2']}, index=[0,1,2])
df4 = pd.DataFrame({'item':['item1', 'item2', 'item3'],
'count':['count1', 'count2', 'count3'],
'price':['price1', 'price2', 'price3'],
'var':['var1', 'var2', 'var3']}, index=[1,2,3])
df4를 보면 'var'이라는 컬럼이 하나 더 있는 것을 확인할 수 있다.
이 때 concat의 'join' 파라미터를 사용할 수 있다.
join : 어떤 방식으로 데이터프레임을 병합할 지 결정
- inner : 교집합(default)
- outer : 합집합
# join의 outer(합집합)
pd.concat([df3, df4],join='outer')
# df3에 없는 var 변수까지 합침
outer의 경우 존재하지 않는 값에 대해서는 NaN으로 처리한다.
# join의 inner(교집합)
pd.concat([df3,df4], join='inner')
# 공통적으로 있는 컬럼만 합침.
인덱스가 중복인 경우에는 concat의 'verify_integrity' 파라미터를 사용한다. 'verify_integrity'는 데이터프레임에서 인덱스의 중복 여부를 검토하는 파라미터로 기본값은 False다. 즉, 중복값이 있는 경우 True로 했을 때 오류 메세지가 출력된다.
# 변수 생성
df5 = pd.DataFrame({'A':['A0', 'A1', 'A2'],
'B':['B0', 'B1', 'B2'],
'C':['C0', 'C1', 'C2'],
'D':['D0', 'D1', 'D2']}, index=['I0', 'I1', 'I2'])
df6 = pd.DataFrame({'A':['AA2', 'A3', 'A4'],
'B':['BB2', 'B3', 'B4'],
'C':['CC2', 'C3', 'C4'],
'D':['DD2', 'D3', 'D4']}, index=['I2', 'I3', 'I4'])
# 인덱스 중복
# verify_integrity 확인
pd.concat([df5,df6], verify_integrity=True)
# index가 중복되었으므로 오류가 발생한다.
merge와 join 함수를 활용하여 특정 key를 기준으로 데이터프레임을 병합할 수 있다.
customer = pd.DataFrame({'customer_id' : np.arange(6),
'name' : ['James', 'Elly', 'Tom', 'Givert', 'Aiden', 'Brody'],
'age' : [40,20,21,30,31,18]})
orders = pd.DataFrame({'customer_id' : [1,1,2,2,2,3,3,1,4,9],
'item' : ['마우스', '충전기', '이어폰', '헤드셋', '전자펜', '키보드', '전자펜', '마우스', '키보드', '케이스'],
'quality':[1,2,1,1,3,2,2,3,2,1]})
merge 함수는 서로 다른 형태의 값과 데이터프레임을 병합할 때 사용한다. merge 함수에는 두 가지 파라미터가 있다.
how에는 4가지 방법이 있다.
pd.merge(customer, orders, on='customer_id')
# 'customer_id 컬럼을 기준으로 customer과 orders를 병합, how의 기본값은 inner이므로 공통된 값만 병합
# left
pd.merge(customer, orders, on='customer_id', how='left')
# right
pd.merge(customer, orders, on='customer_id', how='right')
# outer
pd.merge(customer, orders, on='customer_id', how='outer')
outer의 결과만 살펴보자.
outer는 합집합이므로 모든 값들이 병합되었다. 이 때 값이 존재하지 않는 경우는 NaN 처리된 것을 확인할 수 있다. 인덱스를 지정하여 데이터프레임을 합치는 방법도 있다.
# 인덱스를 지정하여 데이터프레임 합치기
cust1 = customer.set_index('customer_id')
ord1 = orders.set_index('customer_id')
pd.merge(cust1,ord1, left_index=True, right_index=True)
'customer_id'를 인덱스로 설정한 두 데이터프레임을 병합할 때는 on 파라미터를 사용하지 않고 'left_index'와 'right_index'를 사용하여 병합할 수 있다.
두 파라미터를 True로 지정하여 두 인덱스를 모두 포함하는 inner 형태로 병합할 수 있다.