인덱스로 조인하기
DataFrame.join()을 사용하고 merge()에서 left_index/right_index=True를 설정해 인덱스에 맞춰 DataFrames를 결합합니다.
인덱스로 조인하기은(는) CoddyKit의 무료 Pandas & NumPy Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Pandas & NumPy Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Pandas & NumPy Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
인덱스 기반 Join
지금까지는 일반 열의 값을 일치시켜 DataFrames를 병합했습니다. 하지만 때로는 일치시킬 정보가 열이 아니라 DataFrame의 인덱스에 저장되어 있습니다. Pandas에서는 DataFrame.join()을 사용하거나 left_index=True 또는 right_index=True 매개변수와 함께 pd.merge()를 사용해 인덱스 기반 join을 지원합니다.
DataFrame.join() 메서드
DataFrame.join(other)는 기본적으로 두 DataFrames의 인덱스를 기준으로 join하는 편의 메서드입니다. 이는 left_index=True, right_index=True를 사용한 pd.merge() 호출과 동일합니다. 기본 join 유형은 'left'이며, 기본값이 'inner'인 pd.merge()와 다릅니다. 올바른 결과를 얻으려면 두 DataFrames가 의미 있는 동일 인덱스 레이블을 공유해야 합니다.
import pandas as pd
profiles = pd.DataFrame(
{'age': [25, 30, 22]},
index=['alice', 'bob', 'carol']
)
scores = pd.DataFrame(
{'score': [88, 95, 70]},
index=['alice', 'carol', 'dave']
)
# join: left join on index (default)
result = profiles.join(scores)
print(result)
# age score
# alice 25 88.0
# bob 30 NaN <- bob has no score
# carol 22 95.0join()에서 Join 유형 제어하기
how 매개변수를 join()에 전달하면 pd.merge()와 마찬가지로 어떤 행을 유지할지 제어할 수 있습니다. 옵션은 'left'(기본값), 'right', 'inner', 'outer'입니다. 예를 들어 how='inner'는 두 DataFrames에 모두 나타나는 인덱스만 유지하므로, 오른쪽 테이블에 일치하는 인덱스가 없다면 alice의 행은 삭제됩니다.
# Inner join on index: only rows present in BOTH indices
print(profiles.join(scores, how='inner'))
# age score
# alice 25 88
# carol 22 70
# Outer join: all indices from both
print(profiles.join(scores, how='outer'))
# age score
# alice 25.0 88.0
# bob 30.0 NaN
# carol 22.0 70.0
# dave NaN 95.0여러 DataFrames 한 번에 결합하기
join()이 pd.merge()보다 뛰어난 주요 장점은 DataFrames의 목록을 받아 호출 대상과 한 번에 모두 결합할 수 있다는 점입니다. 모든 DataFrames는 인덱스가 정렬되어 있어야 합니다. 이는 사용자 ID나 날짜처럼 동일한 키로 인덱싱된 특성 테이블이 많고, 이를 하나의 넓은 DataFrame으로 조합하려는 경우에 매우 편리합니다.
emails = pd.DataFrame({'email': ['a@x.com', 'b@x.com', 'c@x.com']},
index=['alice', 'bob', 'carol'])
city = pd.DataFrame({'city': ['NY', 'LA', 'SF']},
index=['alice', 'bob', 'carol'])
# Join multiple DataFrames at once
result = profiles.join([emails, city])
print(result)
# age email city
# alice 25 a@x.com NY
# bob 30 b@x.com LA
# carol 22 c@x.com SF한 테이블의 열과 다른 테이블의 인덱스를 기준으로 결합하기
pd.merge()를 사용하면 left_on/right_index 또는 left_index/right_on으로 열 기반 일치와 인덱스 기반 일치를 조합할 수 있습니다. 한 DataFrame은 키를 열에 저장하고 다른 DataFrame은 키를 인덱스로 사용하는 경우에 유용합니다. join()만으로는 이 작업을 수행할 수 없습니다.
# orders has customer_id as a column; customers is indexed by customer_id
customers_indexed = pd.DataFrame(
{'name': ['Alice', 'Bob', 'Carol']},
index=[101, 102, 103]
)
orders = pd.DataFrame({
'order_id': [1, 2, 3],
'customer_id': [101, 102, 101]
})
result = pd.merge(orders, customers_indexed,
left_on='customer_id', right_index=True)
print(result)
# order_id customer_id name
# 0 1 101 Alice
# 2 3 101 Alice
# 1 2 102 Bobmerge()에서 left_index와 right_index 사용하기
두 DataFrames 모두 키를 인덱스로 가지고 있다면 pd.merge(left, right, left_index=True, right_index=True)를 사용하십시오. 이는 join()과 동일하지만 기본 결합 유형이 'inner'이고 매개변수가 더 명시적입니다. 또한 suffixes와 indicator처럼 다른 모든 pd.merge() 매개변수도 사용할 수 있습니다.
# Both DataFrames indexed by user_id
demog = pd.DataFrame({'age': [25, 30]}, index=[1, 2])
behav = pd.DataFrame({'clicks': [10, 5]}, index=[1, 2])
# Equivalent joins
result1 = demog.join(behav) # left join
result2 = pd.merge(demog, behav, left_index=True, right_index=True) # inner join
print(result1)
print(result2)인덱스 기반 결합을 사용하는 이유
인덱스 기반 결합은 DataFrames가 사용자 ID, 제품 SKU 또는 날짜처럼 의미 있는 식별자를 기준으로 자연스럽게 구성되어 있을 때 선호됩니다. 결합에 인덱스를 사용하면 중복된 키 열로 DataFrame이 복잡해지는 것을 피할 수 있으며, Pandas가 O(log n) 조회를 위해 정렬된 인덱스 구조를 유지하므로 더 빠를 수도 있습니다. 특히 DatetimeIndex가 자연스러운 결합 키인 시계열 데이터에서 자주 사용됩니다.
# Time series example: join temperature and humidity by date index
import numpy as np
dates = pd.date_range('2024-01-01', periods=5)
temp = pd.DataFrame({'temp_c': [10, 12, 9, 11, 13]}, index=dates)
humid = pd.DataFrame({'humidity': [65, 70, 60, 75, 68]}, index=dates)
weather = temp.join(humid)
print(weather.head())겹치는 열 이름 처리하기
두 DataFrames에 키를 제외하고 이름이 같은 열이 있으면 lsuffix 및 rsuffix 매개변수를 제공하지 않는 한 join()은 기본적으로 ValueError를 발생시킵니다. 이 매개변수는 pd.merge()의 suffixes처럼 작동하며, 왼쪽과 오른쪽 DataFrames의 겹치는 열 이름에 각각 문자열을 덧붙입니다.
df_a = pd.DataFrame({'value': [1, 2]}, index=['x', 'y'])
df_b = pd.DataFrame({'value': [10, 20]}, index=['x', 'y'])
# Without suffixes: raises ValueError
# result = df_a.join(df_b)
# With suffixes: disambiguate column names
result = df_a.join(df_b, lsuffix='_left', rsuffix='_right')
print(result)
# value_left value_right
# x 1 10
# y 2 20결합하기 전에 set_index 사용하기
일반적인 작업 방식은 결합하기 전에 열을 인덱스로 설정하는 것이므로 join() 구문을 사용할 수 있습니다. 결합한 후에는 reset_index()를 사용해 키를 일반 열로 되돌립니다. 이 패턴은 키를 인덱스로 승격하고, 결합한 다음, 키를 다시 일반 열로 내린다는 흐름으로 자연스럽게 읽히므로 코드를 나중에 읽는 사람도 의도를 쉽게 이해할 수 있습니다.
orders_col = pd.DataFrame({'order_id': [1,2,3], 'customer_id': [10,20,10], 'amount': [100,200,150]})
cust_col = pd.DataFrame({'customer_id': [10,20], 'name': ['Alice','Bob']})
result = (
orders_col.set_index('customer_id')
.join(cust_col.set_index('customer_id'), how='left')
.reset_index()
)
print(result)Series를 DataFrame 인덱스에 맞추기
Series에도 인덱스가 있으며, 할당을 사용해 이를 DataFrame의 새 열로 추가할 수 있습니다. 그러면 Pandas가 Series 값을 일치하는 인덱스 레이블에 자동으로 맞춥니다. merge()나 join()을 호출하지 않고 Series에서 단일 열을 추가하려는 경우에 사용할 수 있는 간단한 인덱스 기반 결합 방식입니다.
df = pd.DataFrame({'sales': [100, 200, 150]}, index=['A', 'B', 'C'])
tax_rate = pd.Series({'A': 0.1, 'B': 0.2, 'C': 0.15})
# Index alignment: Series aligns to DataFrame index automatically
df['tax'] = df['sales'] * tax_rate
print(df)
# sales tax
# A 100 10.0
# B 200 40.0
# C 150 22.5인덱스 결합 성능
정렬된 인덱스를 기준으로 결합하는 것은 일반 열을 기준으로 결합하는 것보다 빠릅니다. Pandas가 정렬된 인덱스에서 이진 검색을 사용하기 때문입니다. 같은 키를 반복해서 결합한다면 파이프라인 시작 시 한 번만 해당 키를 인덱스로 설정하십시오. 여러 파일에서 DatetimeIndex를 기준으로 수천 번 결합하는 시계열 작업에서는 특히 중요합니다.
# Sort index before repeated joins for speed
left = left.sort_index()
right = right.sort_index()
# Both sorted -> Pandas uses merge path with binary search
result = left.join(right, how='inner')
# Check if index is sorted
print('Left sorted:', left.index.is_monotonic_increasing)
print('Right sorted:', right.index.is_monotonic_increasing)빠른 확인
이 단원에서 배운 인덱스 기반 결합에 대한 이해도를 확인해 보십시오.
단원 요약
이 단원에서는 다음을 배웠습니다. DataFrame.join()은 기본적으로 인덱스를 기준으로 왼쪽 결합을 수행합니다. left_index=True/right_index=True를 지정한 pd.merge()는 더 세밀하게 제어할 수 있습니다. join()에 목록을 전달하면 여러 DataFrames를 한 번에 결합할 수 있습니다. 또한 정렬된 인덱스를 사용하면 결합 성능이 향상됩니다. 다음에는 pivot_table을 사용해 DataFrames의 형태를 바꾸는 방법을 살펴보겠습니다.
자주 묻는 질문
“인덱스로 조인하기” 강의는 무료인가요?
네 — “인덱스로 조인하기” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Pandas & NumPy Academy 강의 전체를 잠금 해제할 수 있습니다. Pandas & NumPy Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“인덱스로 조인하기”에서 뭘 배우나요?
DataFrame.join()을 사용하고 merge()에서 left_index/right_index=True를 설정해 인덱스에 맞춰 DataFrames를 결합합니다. 브라우저에서 직접 실행하는 실습 코드로 Pandas & NumPy Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Pandas & NumPy Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Pandas & NumPy Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.
“인덱스로 조인하기” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Pandas & NumPy Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Pandas & NumPy Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.