머신러닝&딥러닝

머신러닝 & 딥러닝 기초 9편 | 데이터 통합, 조인(merge, concat)

SecLogs YJ 2026. 3. 13. 23:37
목차

1. 개요
2. merge
  2-1 merge 예제
3. concat
  3-1 concat 예제

 

1. 개요

데이터프레임을 연결한다는 것은 여러 데이터프레임을 세로로 쌓거나, 가로로 나란히 배치하는 것을 의미한다.

 

데이터프레임을 연결하는 데 사용되는 Pandas 메서드는 아래와 같다.

  • merge() : 기준 열을 기반으로 데이터를 합치는 메서드
  • concat() :  특정 축(행 또는 열)을 따라 데이터를 연결하는 메서드

즉, 아래와 같이 이해할 수 있다.

  • merge : 공통 열을 기준으로 데이터를 결합 (SQL JOIN 방식)
    concat : 단순히 데이터를 이어 붙이는 방식

 

2. merge

merge는 두 DataFrame을 공통된 열(key)을 기준으로 연결하는 메서드이다.

데이터베이스에서의 join과 비슷하게 DataFrame 또는 Series객체를 병합한다.

 

Syntax

dataframe.merge(left, right, how, on, left_on, right_on, left_index, right_index, sort, suffixes, copy, indicator, validate)

 

속성 의미
left(필수) 병합할 첫 번째 pandas 객체
right(필수) 병합할 두 번째 pandas 객체
how(선택) 병합 방법을 지정한다. lleft : 왼쪽 DataFrame의 키를 기준으로 병합 (SQL의 LEFT JOIN)
right  :오른쪽 DataFrame의 키를 기준으로 병합 (SQL의 RIGHT JOIN)
outer  :두 DataFrame의 키를 모두 사용 (합집합, FULL OUTER JOIN)
inner(기본값)  :두 DataFrame에 모두 존재하는 키만 사용 (교집합, INNER JOIN)
:cross : 두 DataFrame의 모든 조합 생성 (카르테시안 곱)
on (선택) 두 DataFrame에서 공통으로 존재하는 열 이름을 기준으로 병합할 때 사용한다. 예) on='id'
left_on (선택) 왼쪽 DataFrame에서 어떤 열을 기준으로 병합할지 지정한다.
왼쪽과 오른쪽의 열 이름이 다를 때 사용한다.
right_on (선택) 오른쪽 DataFrame에서 어떤 열을 기준으로 병합할지 지정한다.
왼쪽과 오른쪽의 열 이름이 다를 때 사용한다.
left_index (선택) 왼쪽 DataFrame의 인덱스를 병합 기준으로 사용할지 여부 False(기본값) : 인덱스를 사용하지 않음
True : 왼쪽 DataFrame의 인덱스를 기준으로 병합
right_index (선택) 오른쪽 DataFrame의 인덱스를 병합 기준으로 사용할지 여부 False(기본값) : 인덱스를 사용하지 않음
True : 오른쪽 DataFrame의 인덱스를 기준으로 병합
sort (선택) 병합 결과를 조인 키 기준으로 정렬할지 여부 False(기본값) : : 기존 데이터 순서를 유지
True : 조인 키 기준으로 정렬
suffixes (선택) 두 DataFrame에 같은 이름의 열이 있을 경우, 열 이름 뒤에 붙일 문자열을 지정한다. 기본값 : '_x', '_y
예) name_x → 왼쪽 DataFrame의 name
     name_y → 오른쪽 DataFrame의 name
copy (선택) 병합 결과를 새로운 DataFrame으로 복사할지 여부 False : 가능하면 복사하지 않고 기존 데이터를 활용
True(기본값) : 새로운 DataFrame을 생성
indicator (선택) 각 행이 어느 DataFrame에서 왔는지 표시하는 열을 추가한다. False(기본값) : 표시하지 않음
True : 각 행의 출처 정보를 담음 '_merge' 열 추가
validate (선택) 병합 형태가 올바른지 검사한다.

 

merge는 SQL의 JOIN과 같다.

pandas SQL
inner INNER JOIN
left LEFT JOIN
right RIGHT JOIN
outer FULL OUTER JOIN

 

2-1 merge 예제

예제 1) 예제 데이터 생성

merge() 메서드를 사용하기 위해 pandas 라이브러리를 불러온다.

import pandas as pd

# 첫 번째 데이터프레임 (직원 정보)
df1 = pd.DataFrame({
    'id': [1, 2, 3, 4],
    'name': ['Kim', 'Lee', 'Park', 'Choi']
})

# 두 번째 데이터프레임 (부서 정보)
df2 = pd.DataFrame({
    'id': [1, 2, 4, 5],
    'dept': ['HR', 'IT', 'Finance', 'Sales']
})

print("df1")
print(df1)

print("\ndf2")
print(df2)

 

예제 1) 출력 결과

df1
   id  name
0   1   Kim
1   2   Lee
2   3  Park
3   4  Choi

df2
   id     dept
0   1       HR
1   2       IT
2   4  Finance
3   5    Sales

 

예제 2) inner merge

df1과 df2를 공통된 열인 'id'를 기준으로 inner merge 한다.

inner merge는 두 DataFrame에 모두 존재하는 키 값만 연결하는 방식이다.

result_inner = pd.merge(df1, df2, on='id', how='inner')
print(result_inner)

 

예제 2) 출력 결과

inner merge 결과, df1과 df2에 모두 존재하는 id 값만 결합된다.

   id  name     dept
0   1   Kim       HR
1   2   Lee       IT
2   4  Choi  Finance

 

예제 3) left merge

df1을 기준으로 df2를 left merge 한다.

left merge는 왼쪽 DataFrame(df1)의 모든 행을 유지면서 병합하는 방식이다.

일치하는 값이 있을 경우 오른쪽 DataFrame(df2)의 데이터를 연결한다.

일치하는 값이 없으면 해당 열은 NaN으로 표시된다.

result_left = pd.merge(df1, df2, on='id', how='left')
print(result_left)

 

예제 3) 출력 결과

left merge 결과, df1의 모든 행이 유지된다.

id=3의 경우, df2에 dept 속성이 없으므로 NaN으로 출력된다..

   id  name     dept
0   1   Kim       HR
1   2   Lee       IT
2   3  Park      NaN
3   4  Choi  Finance

 

 

예제 4) right merge

df1과 df2를 right merge 한다.

right merge는 오른쪽 DataFrame(df2)의 모든 행을 유지하면서 병합하는 방식이다.

일치하는 값이 있을 경우 왼쪽 DataFrame(df1)의 데이터를 연결한다.

일치하는 값이 없으면 해당 열은 NaN으로 표시된다.

result_right = pd.merge(df1, df2, on='id', how='right')
print(result_right)

 

예제 4) 출력 결과

right merge 출력 결과, df2의 모든 행이 출력된다.

id=5의 경우 df1에 name 속성이 없으므로 NaN으로 출력된다.

   id  name     dept
0   1   Kim       HR
1   2   Lee       IT
2   4  Choi  Finance
3   5   NaN    Sales

 

예제 5) outer merge

df1과 d2를 outer merge 한다.

outer merge는 두 Data Frame의 모든 키 값을 기준으로 병합하는 방식이다.

즉, 왼쪽 DataFrame과 오른쪽 DataFrame의 모든 행을 유지하면서 데이터를 결합한다.

 

일치하는 값이 있는 경우 데이터를 연결하고, 없는 경우 해당 열은 NaN으로 표시된다.

result_outer= pd.merge(df1, df2, on='id', how='outer')
print(result_outer)

 

예제 5) 출력 결과

outer merge 결과, df1과 df2에 존재하는 모든 id 값이 포함된다.

id=3의 경우 df2의 dept 값이 없고, id=5의 경우 df1의 name 값이 없어 NaN으로 출력된다.

   id  name     dept
0   1   Kim       HR
1   2   Lee       IT
2   3  Park      NaN
3   4  Choi  Finance
4   5   NaN    Sales

 

3. concat

concat은 두 개 이상의 DataFrame 또는 Series를 특정 축(행 또는 열)을 기준으로 이어 붙이는 함수이다.

 

Syntax

pandas.concat(objs, axis=0, join='outer', ignore_index=False, keys=None,...)

 

속성 의미
objs 연결할 pandas 객체(DataFrame 또는 Series)의 리스트 또는 튜플
axis 연결할 축  0(기본값) : 행을 기준으로 연결한다.
1 : 열을 기준으로 연결한다.
join 열(또는 인덱스) 처리 방식 outer(기본값) : :모든 열을 유지 (합집합)
inner :공통으로 존재하는 열만 유지 (교집합)
ignore_index True로 설정하면 기존 인덱스를 무시하고 0부터 새로운 인덱스를 생성한다.
keys 각 DataFrame에 이름을 부여하여 계층적 인덱스(MultiIndex)를 생성한다.

 

3-1 concat 예제

예제 1) 예제 데이터 생성

concat() 메서드를 사용하기 위해 pandas 라이브러리를 불러온다.

import pandas as pd

# 첫 번째 데이터프레임
df1 = pd.DataFrame({
    'name': ['Kim', 'Lee'],
    'age': [25, 30]
})

# 두 번째 데이터프레임
df2 = pd.DataFrame({
    'name': ['Park', 'Choi'],
    'age': [28, 35]
})

print("df1")
print(df1)

print("\ndf2")
print(df2)

 

예제 1) 출력 결과

df1
  name  age
0  Kim   25
1  Lee   30

df2
   name  age
0  Park   28
1  Choi   35

 

예제 2) 행 기준 concat (axis=0)

두 DataFrame을 행 방향으로 연결한다.

axia=0은 행 기준으로 데이터를 아래로 이어 붙이는 방식이다.

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

print(result_row)

 

예제 2) 출력 결과

df1 아래에 df2가 그대로 이어 붙여진 것을 확인할 수 있다.

이때 기존 인덱스가 유지되기 때문에 인덱스 값이 중복될 수 있다.

   name  age
0   Kim   25
1   Lee   30
0  Park   28
1  Choi   35

 

예제 3) 열 기준 concat (axis=1)

두 DataFrame을 열 방향으로 연결한다.

axis=1은 열 기준으로 데이터를 옆으로 이어 붙이는 방식이다.

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

print(result_col)

 

예제 3) 출력 결과

두 DataFrame이 같은 인덱스를 기준으로 옆으로 결합된 것을 확인할 수 있다.

 name  age  name  age
0  Kim   25  Park   28
1  Lee   30  Choi   35

 

예제 4) ignore_index 사용

ignore_index=True를 사용하면 기존 인덱스를 무시하고 새로운 인덱스를 생성한다.

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

print(result_ignore)

 

예제 4) 출력 결과

기존 인덱스가 제거되고 0부터 새로운 인덱스가 생성된 것을 확인할 수 있다.

  name  age
0   Kim   25
1   Lee   30
2  Park   28
3  Choi   35

 

예제 5) keys 사용

keys를 사용하면 각 DataFrame에 이름을 붙여 계층적 인덱스를 생성할 수 있다.

result_keys = pd.concat([df1, df2], keys=['df1', 'df2'])

print(result_keys)

 

예제 5) 출력 결과

각 DataFrame 앞에 df1, df2라는 상위 인덱스가 추가된 것을 확인할 수 있다.

      name  age
df1 0   Kim   25
    1   Lee   30
df2 0  Park   28
    1  Choi   35

 


👉 머신러닝 & 딥러닝 기초 10편 | 평균, 중앙값, 최빈값 (statistics, pandas)