[pandas] 데이터 프레임 병합/연결하기

파이썬 라이브러리 pandas로 데이터 프레임 병합하는 방법에 대해 정리했다.

데이터 프레임 병합하기 (merge)

pandas에서 merge 메서드를 통해 데이터 프레임을 병합할 수 있다.

new_df = pd.merge(df1, df2)

데이터 프레임 수준에서도 merge 메서드를 바로 사용할 수 있다.

new_df = df1.merge(df2)

이 방법은 3개 이상의 데이터 프레임을 병합할 때 유용하다.

big_df = df1.merge(df2).merge(df3)

병합의 기준이 되는 열 지정

merge를 사용하면 공통된 열 이름이 있을 경우 그걸 기준으로 병합하기 때문에 문제가 될 수 있다.

예를 들면 orders, customers 라는 두 개의 데이터 프레임을 병합하려고 하는데, 각각  내용은 다르지만 id라는 공통의 이름을 열이 존재할 경우 그냥 병합해버리면 데이터가 꼬이게 되는 것이다.

이걸 해결하는 한 가지 방법은 rename을 사용하는 것이다.

customers 데이터 프레임 안에 있는 id 열은 orders에 있는 customer_id와 같은 내용이니 애초에 매칭이 되도록 이름을 바꿔 놓고 병합하는 방식이다.

pd.merge(orders, customers.rename(columns={'id': 'customer_id'}))

아니면 병합 과정에서 직접 명시해서 매칭시킬 수도 있다.

예를 들어 orders 데이터 프레임의 customer_id에 해당하는 열이 customers 데이터 프레임의 id와 같으니 이걸 기준으로 병합하라고 직접 적어주는 것이다.

pd.merge(orders, customers, left_on='customer_id', right_on='id')

그런데 이 경우 (병합의 기준이 된 열과 관계 없이) 애초에 두 데이터 프레임에 id라는 같은 이름을 가진 열이 존재하기 때문에 병합 후 id_x, id_y 이런 식으로 새로운 이름으로 표시가 된다. pandas에서 알아서 구분해주는 거다.

이 경우 suffixes를 통해 공통된 열 이름은 어떤 접미어를 달지 미리 지정하면 된다.

pd.merge(orders, customers, left_on='customer_id', right_on='id', \ 
    suffixes=['_order', '_customer'])

Outer Merge

기본적인 merge를 활용해서 데이터 프레임을 병합할 경우, 열 정보가 매칭이 되는 행들은 병합이 되지만 매칭이 되지 않는 행들은 누락되어 버리는 문제가 있다.

이 경우 merge 안에 how='outer'를 명시하여 해결해야 한다. 기본 값은 how='inner'(매칭되지 않는 행은 포함하지 않기)다.

예를 들어 이런 두 개의 데이터 프레임을 병합한다고 했을 때

이렇게 how='outer'를 명시하면 된다.

pd.merge(company_a, company_b, how='outer')

결과 값은 이렇게 나온다.

누락된 값은 None 또는 nan(Not a Number)로 들어간다.


how='left'how='right'도 있다. 왼쪽 혹은 오른쪽 데이터 프레임에 포함된 값들만 가져온다는 의미다.

위 예제를 기준으로 하면 각각 아래와 같은 결과가 나온다.

pd.merge(company_a, company_b, how='left')
pd.merge(company_a, company_b, how='right')

데이터 프레임 연결하기 (concat)

동일한 열 이름을 가진 데이터 프레임 두개를 연결하려면 (하나의 데이터 프레임으로 합쳐서 쌓으려면) concat 메서드를 활용하면 된다.

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

concat() 괄호 안에는 데이터 프레임을 리스트의 형태로 넣어주면 된다.

지금 인기 글


댓글 남기기