메인 콘텐츠로 이동하기
  1. 블로그 글/

파이썬 - pandas 데이터 통합하기 (concat, join, merge)

·4 분

본 글은 pandas 라이브러리를 활용하는 데에 있어 여러 개의 데이터를 하나로 통합하는 방법을 설명하기 위해 작성되었습니다.

데이터를 통합하는 방법으로는 여러 가지가 있는데 이번에 다루어 볼 내용은 concat, join, merge입니다.

우선 설명하기에 앞서, 예시로 두 개의 데이터 프레임을 작성하도록 하겠습니다.

>>> import pandas as pd 

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

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

d1 출력값:

Class1 Class2
0 87 85
1 89 90

d2 출력값:

Class1 Class2
0 95 91
1 92 93
2 98 97
3 100 99

1. concat #

pandas 라이브러리의 concat 함수는 데이터프레임을 이어 붙이는 데 사용됩니다. 이 함수는 여러 데이터프레임을 행 또는 열 방향으로 이어 붙일 수 있습니다.

df1과 df2를 result에 붙이도록 하겠습니다.

>>> result = pd.concat([df1, df2])
>>> result
Class1 Class2
0 95 91.0
1 92 93.0
2 98 97.0
3 100 99.0
4 87 85.0
5 89 90.0
6 96 NaN
7 83 NaN

**pd.concat([df1, df2])**는 df1과 df2를 행 방향으로 이어 붙입니다. 즉, 두 데이터프레임이 위아래로 연결됩니다.

다음으로는 Class1 열만 가지고 있는 d3를 result에 통합하도록 하겠습니다.

>>> df3 = pd.DataFrame({
    'Class1' : [96, 83]
})

>>> pd.concat([result, df3], ignore_index=True)
Class1 Class2
0 95 91.0
1 92 93.0
2 98 97.0
3 100 99.0
4 87 85.0
5 89 90.0
6 96 NaN
7 83 NaN

d3 데이터는 ‘Class2’ 열을 가지고 있지 않기 때문에 공백값을 출력하게 됩니다.

2. join #

pandas 라이브러리의 join 메서드는 두 개의 데이터프레임을 특정 열을 기준으로 결합하는 데 사용됩니다. 일반적으로 SQL의 JOIN 연산과 유사한 역할을 합니다. concat과 달리 join은 가로 방향으로 통합됩니다.

>>> df4 = pd.DataFrame({
    'Class3' : [93, 91, 95, 98]
})

>>> df1.join(df4)
Class1 Class2 Class3
a 95 91 93
b 92 93 91
c 98 97 95
d 100 99 98

다음과 같이 index를 임의로 설정하여 출력하는 것 또한 가능합니다.

>>> index_label = ['a','b','c','d']
>>> df1a = pd.DataFrame({'Class1': [95, 92, 98, 100],
                    'Class2': [91, 93, 97, 99]}, index= index_label)
>>> df4a = pd.DataFrame({'Class3': [93, 91, 95, 98]}, index=index_label)

>>> df1a.join(df4a)
Class1 Class2 Class3
a 95 91 93
b 92 93 91
c 98 97 95
d 100 99 98

3. merge #

pandas 라이브러리의 merge 함수는 두 개의 데이터프레임을 특정 열을 기준으로 병합(merge)하는 데 사용됩니다. merge 함수를 사용하면 데이터프레임 간에 공통된 열을 기준으로 결합할 수 있습니다.

>>> df_A_B = pd.DataFrame({'판매월': ['1월', '2월', '3월', '4월'],
                       '제품A': [100, 150, 200, 130],
                       '제품B': [90, 110, 140, 170]})

>>> df_C_D = pd.DataFrame({'판매월': ['1월', '2월', '3월', '4월'],
                       '제품C': [112, 141, 203, 134],
                       '제품D': [90, 110, 140, 170]})

df_A_B

판매월 제품A 제품B
0 1월 100 90
1 2월 150 110
2 3월 200 140
3 4월 130 170

df_C_D

판매월 제품C 제품D
0 1월 112 90
1 2월 141 110
2 3월 203 140
3 4월 134 170

merge를 사용하여 ‘판매월’  열을 기준으로 두 데이터프레임을 병합합니다. 결과적으로 ‘판매월’ 열을 기준으로 두 데이터프레임이 합쳐지고, 공통된 열을 중심으로 데이터가 정렬됩니다.

>>> df_A_B.merge(df_C_D)
판매월 제품A 제품B 제품C 제품D
0 1월 100 90 112 90
1 2월 150 110 141 110
2 3월 200 140 203 140
3 4월 130 170 134 170

merge 메서드를 사용하여 두 데이터프레임을 결합하는 네 가지 다른 방법을 구현해 보도록 하겠습니다.

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

1.

>>> df_left.merge(df_right, how='left', on = 'key')
key left right
0 A 1 4.0
1 B 2 5.0
2 C 3 NaN

‘key’ 열을 기준으로 df_left와 df_right를 왼쪽 조인(left join)합니다. 왼쪽 조인은 왼쪽 데이터프레임(df_left)의 모든 행을 유지하고, 오른쪽 데이터프레임(df_right)의 해당 키 값이 있는 행을 추가합니다. 만약 해당 키 값이 오른쪽 데이터프레임에 없으면 NaN으로 채웁니다.

2.

>>> df_left.merge(df_right, how='right', on = 'key')
key left right
0 A 1.0 4
1 B 2.0 5
2 D NaN 6

‘key’ 열을 기준으로 df_left와 df_right를 오른쪽 조인(right join)합니다. 오른쪽 조인은 오른쪽 데이터프레임(df_right)의 모든 행을 유지하고, 왼쪽 데이터프레임(df_left)의 해당 키 값이 있는 행을 추가합니다. 만약 해당 키 값이 왼쪽 데이터프레임에 없으면 NaN으로 채웁니다.

3.

>>> df_left.merge(df_right, how='outer', on = 'key')
key left right
0 A 1.0 4.0
1 B 2.0 5.0
2 D 3.0 NaN
3 D NaN 6.0

‘key’ 열을 기준으로 df_left와 df_right를 외부 조인(outer join)합니다. 외부 조인은 양쪽 데이터프레임의 모든 행을 포함하며, 양쪽 데이터프레임 중 한쪽에만 해당하는 경우 NaN으로 채웁니다.

4.

>>> df_left.merge(df_right, how='inner', on = 'key')
key left right
0 A 1 4
1 B 2 5

‘key’ 열을 기준으로 df_left와 df_right를 내부 조인(inner join)합니다. 내부 조인은 양쪽 데이터프레임에 공통으로 존재하는 행만을 포함합니다. 즉, 양쪽 데이터프레임에서 동일한 ‘key’ 값을 가지는 행들을 결합합니다.