파이썬 - pandas 데이터 통합하기 (concat, join, merge)
목차
본 글은 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’ 값을 가지는 행들을 결합합니다.