[Pandas] DataFrame 병합,연결,결합

2024. 1. 8. 18:59Pandas

오늘은 Pandas를 이용해서 데이터를 병합하는 방법에 대해서 리마인드 해볼까 합니다. 데이터를 병합하는 것은 중요합니다. 실제 회사의 데이터에는 여러가지 데이터 테이블이 있고, 한가지 테이블에서만 인사이트를 도출한다는 것은 드물다고 생각합니다. 학부 3학년 때 전사적자원관리라는 강의를 들었는데, ERP라는 프로그램을 통해 기업의 생산, 물류, 인사, 회계 이 4가지 모듈들의 데이터를 통합해서 관리하는 프로그램입니다. 여기서 사용되는 데이터 테이블은 정말 많습니다.. 그래서 이 데이터를 어떻게 병합할 수 있는지 리마인드 해보도록 하겠습니다.

https://github.com/ghkstod/TIL/blob/main/ipynb/24-01-08pandasdatamerge.ipynb

 

1.pd.concat()

일단 데이터 생성부터 해보겠습니다. 데이터는 간단하게 생성하겠습니다. 데이터의 크기는 중요하지 않으니..

import numpy as np
import pandas as pd

df1=pd.DataFrame({
    'Class1':[95,92,98,100],
    'Class2':[91,93,97,99],
})

df2=pd.DataFrame({
    'Class1':[97,89],
    'Class2':[85,90]
})

df1과 df2는 서로 같은 컬럼을 공유합니다. 그래서 사살상 동일한 테이블을 하나의 테이블로 합쳐서 보고싶습니다. 이 경우 pd.concat([df1,df2])의 방식으로 병합할 수 있습니다.

pd.concat([df1,df2])

서로 맞는 컬럼끼리 잘 합쳐진 모습이지만 어딘가 불편한 점이 존재합니다. 바로 인덱스의 번호가 기존에 있던 데이터프레임의 인덱스를 가지고 왔다는 점입니다. 이 경우 ignore_index=True를 통해 해결할 수 있습니다.

pd.concat([df1,df2],ignore_index=True)

그리고 모든 컬럼이 공유하는 컬럼이 아닐 경우에도 pd.concat을 사용할 수 있습니다. 이러한 새로운 데이터 프레임이 있다고 할 때 df1과 병합해 보도록 하겠습니다.

pd.concat([df1,df3],ignore_index=True)

이 경우에는 NULL값으로 들어가게 됩니다.

 

2.join(): 행방향으로 통합

이번에는 이러한 데이터가 있다고 가정해봅니다.

이 데이터는 df1과 겹치는 컬럼이 존재하지 않습니다. 이 경우 행방향으로 데이터를 연결한다면 데이터가 각 컬럼마다 4개씩 잘 들어갈 것 같습니다. 그래서 이번엔 join()을 사용할 것입니다. 사용방법은 df1.join(df2)입니다. 그래서 df1과  df4를 join해보면

df1.join(df4)

다음과 같이 잘 나온것을 확인 할 수 있습니다. 근데 사실 pd.concat도 가능합니다. 데이터를 어느 방향으로 병합할지 방향만 정해준다면 이렇게 병합하는 것도 가능합니다. 행방향(axis=1) 열방향(axis=0, default) 로 방향을 설정할 수 있습니다. 그래서 pd.concat을 아무것도 입력하지 않고 df1과 df4를 병합한다면 이러한 결과가 나옵니다.

하지만 axis=1로 방향을 지정해준다면 join 과 같은 결과가 나오게 됩니다.

 

3.merge()

merge를 통해서도 데이터를 병합시킬 수 있습니다. merge()에서 중요한 것은 데이터를 어떻게 병합시킬 것인지 how=' '에 대한 부분이 중요합니다. 우선 사용 방법은 df1.merge(df2)가 기본적인 사용 방법입니다.

df_left = pd.DataFrame({'key':['A','B','C'], 'left': [1, 2, 3]})
df_right = pd.DataFrame({'key':['A','B','D'], 'right': [4, 5, 6]})
df_left.merge(df_right)

실행하면 이런 방식으로 실행이 됩니다. 데이터 프레임을 보면 Key라는 컬럼이 겹치는 것만 출력되는 것을 볼 수 있습니다. 이건 현재 디폴트 값으로 앞서 중요하다고 쓴 how=''에 해당합니다. 지금은 아래의 코드와 동일한 결과를 출력합니다.

df_left.merge(df_right,how='inner',on='key')

key컬럼을 대상으로 서로 공유하는 컬럼만 병합하는 것을 inner join이라고 합니다.

 

또한 공유 대상이 아닌 모든 컬럼을 대상으로 병합하는 것은 outer join 이라고 하며 코드로 이렇게 나타낼 수 있습니다.

df_left.merge(df_right,how='outer',on='key')

또한 어느 한쪽 데이터프레임을 기준으로 병합을 할 수 있는데 각각 방향에 따라 left, rifgt join이라고 합니다.

 

오늘 데이터 병합에 대해 리마인드 하면서 물론 파이썬으로도 이미 알고 있는 부분이긴 했지만, 학부 시절에 데이터베이스설계 라는 과목에서 SQL로 먼저 배웠어서 그 과목을 수강할 때가 제일 먼저 기억이 났는데, 지금은 거의 내용적인 부분은 생각이 안나서,,  데이터베이스설계 부분도 다시 공부하면서 기록해보도록 하겠습니다.

'Pandas' 카테고리의 다른 글

[Pandas] 외부 파일 불러오고 내보내기  (1) 2024.01.08
[Pandas] iloc vs loc의 차이  (1) 2024.01.08
[Pandas] 기초 문법  (0) 2024.01.06