Python/Pandas

[Pandas] 데이터 병합 - merge(), concat(), join()

죵욜이 2024. 12. 16. 03:13

 merge()  함수

  • SQL 의 JOIN 처럼 데이터를 '기준 열' 을 기준으로 병합
    • inner join
    • outer join
    • left join
    • right join
import pandas as pd

# 예시 데이터프레임
df1 = pd.DataFrame({
    'A': [1, 2, 3],
    'B': ['A1', 'B2', 'C3']
})

df2 = pd.DataFrame({
    'A': [1, 2, 4],
    'C': ['X1', 'Y2', 'Z3']
})

# 'A' 열을 기준으로 병합
merged_df = pd.merge(df1, df2, on='A')
print(merged_df)
# 출력
   A   B   C
0  1  A1  X1
1  2  B2  Y2

 

  •  merge()  의 기본값은 inner join  

병합 유형

 

  • 내부 조인 (inner join): 기본값입니다. 두 데이터프레임에서 공통된 키만 포함됩니다.
  • 왼쪽 조인 (left join): 왼쪽 데이터프레임의 모든 값을 포함하고, 오른쪽 데이터프레임에서 일치하는 값만 추가합니다.
  • 오른쪽 조인 (right join): 오른쪽 데이터프레임의 모든 값을 포함하고, 왼쪽 데이터프레임에서 일치하는 값만 추가합니다.
  • 외부 조인 (outer join): 두 데이터프레임에서 모든 값을 포함하고, 일치하지 않는 값은 NaN으로 채웁니다.

 

더보기
# 왼쪽 조인
left_merged_df = pd.merge(df1, df2, on='A', how='left')
print(left_merged_df)

# 오른쪽 조인
right_merged_df = pd.merge(df1, df2, on='A', how='right')
print(right_merged_df)

# 외부 조인
outer_merged_df = pd.merge(df1, df2, on='A', how='outer')
print(outer_merged_df)
# left join 출력값
   A   B    C
0  1  A1   X1
1  2  B2   Y2
2  3  C3  NaN
# right join 출력값
   A   B   C
0  1  A1  X1
1  2  B2  Y2
2  4 NaN  Z3
# outer join 출력값
   A   B    C
0  1  A1   X1
1  2  B2   Y2
2  3  C3  NaN
3  4 NaN  Z3

다중 열을 기준으로 병합

  • 두 개 이상의 열을 기준으로 병합도 가능
# 예시 데이터프레임
df1 = pd.DataFrame({
    'A': [1, 2, 3],
    'B': ['A1', 'B2', 'C3'],
    'key': ['K1', 'K2', 'K3']
})

df2 = pd.DataFrame({
    'A': [1, 2, 3],
    'B': ['X1', 'Y2', 'Z3'],
    'key': ['K1', 'K2', 'K3']
})

# 'A'와 'key' 열을 기준으로 병합
merged_df_multi = pd.merge(df1, df2, on=['A', 'key'])
print(merged_df_multi)
# 출력
   A   B key
0  1  A1  K1
1  2  B2  K2
2  3  C3  K3

 concat()  함수

  • 행 또는 열 기준으로 단순히 연결할 때 사용
  •  axis  를 이용해 방향설정
# 예시 데이터프레임
df1 = pd.DataFrame({
    'A': [1, 2],
    'B': ['A1', 'B2']
})

df2 = pd.DataFrame({
    'A': [3, 4],
    'B': ['C3', 'D4']
})

# 행 기준으로 병합 (기본값 axis=0)
concat_df = pd.concat([df1, df2])
print(concat_df)
# 출력
   A   B
0  1  A1
1  2  B2
0  3  C3
1  4  D4
더보기

인덱스 재정렬

  •  ignore_index=True  를 설정해 인덱스를 새로 부여
# 인덱스를 새로 부여하여 병합
concat_df_reset_index = pd.concat([df1, df2], ignore_index=True)
print(concat_df_reset_index)
# 출력
   A   B
0  1  A1
1  2  B2
2  3  C3
3  4  D4

 join()  함수

  • 주로 인덱스 기준으로 병합할때 사용
  • 기본값 left join
df1 = pd.DataFrame({
    'A': [1, 2, 3],
    'B': ['A1', 'B2', 'C3']
}, index=['K1', 'K2', 'K3'])

df2 = pd.DataFrame({
    'C': ['X1', 'Y2', 'Z3'],
    'D': ['W1', 'X2', 'Y3']
}, index=['K1', 'K2', 'K3'])

# 인덱스를 기준으로 병합
joined_df = df1.join(df2)
print(joined_df)
# 출력
    A   B   C   D
K1  1  A1  X1  W1
K2  2  B2  Y2  X2
K3  3  C3  Z3  Y3