2022 데이터 사이언스/빅데이터 분석과 모델링

04. Pandas(3): 데이터 합치기

gool 2022. 6. 13. 18:03
Pandas에는 2개 이상의 DataFrame을 결합하는 메소드가 존재한다.

 

 

 

Pandas에서 concat, merge, join 메소드를 사용해 2개 이상의 데이터프레임을 합칠 수 있다.

  • concat : 축을 따라 데이터프레임 연결 (default : axis=0)
  • merge : 두 데이터프레임에 공통으로 존재하는 열을 기준으로 병합
  • join : 두 데이터프레임의 행 인덱스를 기준으로 병합

 

 

 

concat

 

concat은 데이터프레임을 행 방향이나 열 방향으로 단순 연결하는 메소드이다.

빈 데이터는 모두 NaN 데이터로 처리된다.

 

import pandas as pd

pd.concat([df1, df2])

 

pd.concat([df1, df2], axis=1)

 

 

 

concat의 경우 기존의 행 인덱스나 열 이름이 그대로 연결된다.

즉, 새로운 행 인덱스가 생성되지 않고, 행 인덱스와 열 이름이 중복될 가능성이 있다.

 

데이터프레임 df1(왼쪽), df2

 

 

* 0부터 시작하는 순차적인 행 인덱스의 부재

result1 = pd.concat([df1, df2])

 

* 열 이름의 중복

result2 = pd.concat([df1, df2], axis=1)

 

 

 

행 인덱스가 정리되어 있지 않고 열 이름이 중복되어 발생할 수 있는 문제를 방지하기 위해,

새로운 정수형 위치 인덱스를 생성하고 열 이름을 변경하는 법을 알아본다.

 

 

1) 정수형 위치 인덱스 생성

 

(1) reset_index() 활용

  • result1.reset_index(inplace=True)
  • result1.drop('index', axis=1)  :  열 방향 지정하여 열 삭제
  • result1.reset_index(drop=True, inplace=True)  :  기존 인덱스 삭제 후 인덱스 재설정

 

 

(2) ignore_index=True

  • pd.concat([df1, df2], ignore_index=True)  :  병합 시에 ignore_index=True 옵션 사용

 

 

 

2) 열 이름 변경

 

중복을 방지하고자 concat 전에 미리 2개의 기존 데이터프레임 중 하나의 열 이름을 변경해준 뒤,

앞선 작업과 동일하게 열 기준 concat을 진행한다.  →  pd.concat([df1, df2], axis=1)

 

df2 = df2.rename(columns = {'a' : 'a2', 'b' : 'b2', 'c' : 'c2'})

 

 

 

merge

 

고유한 키(unique id) 값을 기준으로 데이터를 병합한다.

 

 

pd.merge(왼쪽 데이터프레임, 오른쪽 데이터프레임, how='...', on='...')

 

 

* on : join의 기준이 되는 컬럼 명시

* how : join 방식 {'left', 'right', 'outer', 'inner'}

  • left : left outer join (일치하는 값이 없어도 왼쪽 데이터는 모두 반환)
  • right : right outer join (일치하는 값이 없어도 오른쪽 데이터는 모두 반환)
  • outer : full outer join (일치하는 값이 없어도 모든 행 반환)
  • inner : 일치하는 값이 있는 행만 반환 (default)

 

 

 

다음 두 개의 데이터프레임을 활용하여 merge 병합을 살펴보자.

 

데이터프레임 df1(왼쪽), df2

 

 

(1) pd.merge(df1, df2, how='left', on='name')

왼쪽 데이터인 df1을 기준으로 병합하므로,

df2의 데이터 중 df1 'name'에 존재하는 Lee, Kim의 데이터만 병합된다.

 

 

outer join과 inner join의 차이를 비교하기 위해 df1에 새로운 행을 추가한다.

 

df1.loc[2, :] = ['jung', 'C']

 

새로운 데이터프레임 df1(왼쪽), df2

 

 

(2) pd.merge(df1, df2, how='outer', on='name')

일치하는 'name' 값이 없는 3, 4행도 모두 반환된다.

공통된 값이 없어도 모두 포함하는 합집합 개념이라고 생각하면 편하다.

 

 

(3) pd.merge(df1, df2, how='inner', on='name')

일치하는 'name' 값이 없는 3, 4행은 반환되지 않는다.

공통된 값이 있는 경우만 포함되는 교집합 개념과 유사하다.

 

 

 

join

 

join의 경우 내부적으로 Pandas의 merge를 사용하므로,

인덱스를 기준으로 병합한다는 것만 제외하면 merge와 같다.

기본값은 인덱스를 기준으로 left join하는 것이다.

 

join은 인덱스를 기준으로 병합이 이루어지기 때문에,

병합에 앞서 병합에 사용될 데이터프레임의 인덱스를 설정해주어야 한다.

 

기존 데이터프레임 df1(왼쪽), df2

 

 

* df1, df2의 'name' 열을 인덱스로 설정한 df_left, df_right 생성

df_left = df1.set_index(['name'])

df_right = df2.set_index(['name'])

 

'name'을 df_left(왼쪽), df_right의 인덱스로 설정

 

 

df_left.join(df_right)

'name' 인덱스를 기준으로 df_right가 df_left 쪽으로 left inner join된 것을 볼 수 있다.

 

 

 

데이터 합치기 실습 코드는 아래 링크에서 확인해볼 수 있다.

 

https://github.com/tldnjs1231/data-analytics/blob/main/data-analytics-04-pandas_(3).ipynb 

 

GitHub - tldnjs1231/data-analytics

Contribute to tldnjs1231/data-analytics development by creating an account on GitHub.

github.com