반응형

데이터 처리와 분석에서 가장 중요한 부분 중 하나는 여러 출처에서 가져온 다양한 데이터를 하나로 통합하는 것입니다. 판다스는 이러한 데이터프레임 간의 결합을 지원하는 다양한 기능을 제공하며, 이 글에서는 그 중 핵심적인 merge, join, concat 메서드를 중점적으로 다룹니다. 데이터프레임을 결합하는 방법을 배우고 실제 예제를 통해 적용하는 과정을 따라가 보겠습니다.

 

 

목차

 

1. 개요

데이터 분석을 진행할 때, 종종 여러 데이터 소스에서 수집된 데이터를 하나로 통합해야 하는 상황이 발생합니다. 예를 들어, 고객 정보가 담긴 데이터프레임과 구매 이력이 담긴 데이터프레임을 결합하여 고객별 구매 이력을 분석할 수 있습니다. 이렇게 여러 데이터프레임을 효과적으로 결합하는 것은 데이터 분석의 기본적이면서도 중요한 단계입니다.

판다스는 데이터프레임 간의 결합을 지원하는 다양한 함수를 제공합니다. 이러한 함수들을 사용하면 서로 다른 데이터프레임을 쉽게 결합할 수 있으며, 데이터 분석의 효율성과 정확성을 크게 향상시킬 수 있습니다. 결합의 방식에 따라 필요한 데이터만을 선택적으로 추출하거나, 누락된 데이터를 채워 넣는 등의 고급 기능도 지원합니다.

 

2. 결합의 종류

판다스에서 제공하는 데이터프레임 결합 방법은 크게 세 가지입니다: merge, join, concat. 각 방법은 다양한 경우에 적합하며, 사용자의 요구 사항과 데이터의 특성에 따라 적절한 방법을 선택할 수 있습니다.

  • merge: 두 데이터프레임의 공통된 컬럼을 기준으로 결합하는 방법입니다. SQL의 JOIN과 유사한 방식으로 작동하며, 여러 가지 결합 방식(예: inner, left, right, outer)을 지원합니다.
  • join: 두 데이터프레임의 인덱스를 기준으로 결합하는 방법입니다. merge와 유사하게 작동하지만, 주로 인덱스를 기준으로 결합할 때 사용됩니다.
  • concat: 주어진 축을 기준으로 여러 데이터프레임을 연결하는 방법입니다. 수직 또는 수평 방향으로 데이터프레임을 연결할 수 있습니다.

이러한 결합 방법들은 각각 특정한 상황과 요구 사항에 맞춰 사용됩니다. 따라서 데이터의 특성과 분석의 목적을 고려하여 적절한 결합 방법을 선택하는 것이 중요합니다.

 

3. merge 함수를 사용한 결합

판다스의 merge 함수는 두 데이터프레임을 결합하기 위한 핵심 도구입니다. 이 함수는 SQL의 JOIN과 유사하게 작동하며, 특정 컬럼 또는 인덱스를 기준으로 데이터프레임을 결합할 수 있습니다.

 

3.1. 기본적인 merge 사용법

merge 함수를 사용하여 두 데이터프레임을 결합하는 가장 기본적인 방법은 다음과 같습니다:

import pandas as pd

# 예제 데이터프레임 생성
df1 = pd.DataFrame({'key': ['A', 'B', 'C', 'D'],
                   'value': [1, 2, 3, 4]})
df2 = pd.DataFrame({'key': ['C', 'D', 'E', 'F'],
                   'value': [3, 4, 5, 6]})

# merge 함수를 사용한 결합
merged_df = pd.merge(df1, df2, on='key')

위의 코드에서, on='key'는 두 데이터프레임이 'key' 컬럼을 기준으로 결합된다는 것을 의미합니다. 결과적으로 'key' 컬럼의 값이 일치하는 행만이 merged_df에 포함됩니다.

 

3.2. on 파라미터: 결합의 기준이 되는 컬럼 지정

on 파라미터를 사용하면 두 데이터프레임이 결합되는 기준이 되는 컬럼을 지정할 수 있습니다. 이 파라미터의 값은 단일 컬럼 이름이 될 수도 있고, 여러 컬럼의 리스트가 될 수도 있습니다.

# 여러 컬럼을 기준으로 결합하는 예제
merged_df_multi = pd.merge(df1, df2, on=['key', 'value'])

위의 코드에서는 'key'와 'value' 두 컬럼을 기준으로 데이터프레임이 결합됩니다.

 

3.3. how 파라미터: 어떤 종류의 결합을 할 것인지

how 파라미터는 두 데이터프레임을 어떻게 결합할 것인지를 지정합니다. 가능한 값은 'inner', 'left', 'right', 'outer' 등입니다.

  • inner: 두 데이터프레임의 공통된 값만을 결합합니다.
  • left: 첫 번째 데이터프레임의 모든 값과, 두 번째 데이터프레임의 일치하는 값만을 결합합니다.
  • right: 두 번째 데이터프레임의 모든 값과, 첫 번째 데이터프레임의 일치하는 값만을 결합합니다.
  • outer: 두 데이터프레임의 모든 값을 결합합니다.
# 'how' 파라미터를 사용한 예제
merged_inner = pd.merge(df1, df2, on='key', how='inner')
merged_left = pd.merge(df1, df2, on='key', how='left')
merged_right = pd.merge(df1, df2, on='key', how='right')
merged_outer = pd.merge(df1, df2, on='key', how='outer')

각 결합 방식은 특정한 상황과 요구 사항에 따라 적절하게 선택되어야 합니다. 예를 들어, 두 데이터프레임의 공통된 부분만을 분석하고자 할 때는 'inner' 방식을, 한 데이터프레임의 모든 정보를 보존하며 다른 데이터프레임과의 관계를 파악하고자 할 때는 'left' 또는 'right' 방식을 선택할 수 있습니다.

 

4. join 함수를 사용한 결합

판다스의 join 함수는 데이터프레임의 인덱스를 기준으로 두 데이터프레임을 결합하는데 사용됩니다. 이는 SQL의 JOIN 연산과 유사하지만, 주로 인덱스를 기준으로 작동하는 특징이 있습니다.

 

4.1. 기본적인 join 사용법

join 함수를 사용하여 두 데이터프레임을 결합하는 기본적인 방법은 다음과 같습니다:

import pandas as pd

# 예제 데이터프레임 생성
df1 = pd.DataFrame({'A': [1, 2, 3]}, index=['a', 'b', 'c'])
df2 = pd.DataFrame({'B': [4, 5, 6]}, index=['b', 'c', 'd'])

# join 함수를 사용한 결합
joined_df = df1.join(df2)

위의 코드에서, 데이터프레임 df1df2는 각각 인덱스를 기준으로 결합됩니다. 따라서 인덱스가 일치하는 행만이 결과 데이터프레임 joined_df에 포함됩니다.

 

4.2. join과 merge의 차이점

joinmerge는 둘 다 두 데이터프레임을 결합하는 데 사용되지만, 주요한 차이점이 있습니다.

  • 기본 결합 기준: join은 기본적으로 인덱스를 기준으로 두 데이터프레임을 결합합니다. 반면, merge는 컬럼 값을 기준으로 결합합니다.
  • 유연성: mergeon 파라미터를 통해 결합의 기준이 될 컬럼을 지정할 수 있습니다. 반면, join은 주로 인덱스를 기준으로 작동하지만, 컬럼을 기준으로도 결합할 수 있습니다.
  • 사용 방법: join은 데이터프레임의 메서드로 호출되며, 결합할 다른 데이터프레임을 인자로 받습니다. merge는 판다스 모듈의 함수로서 호출되며, 두 데이터프레임을 인자로 받습니다.
# merge와 join의 사용법 비교
merged_example = pd.merge(df1, df2, left_index=True, right_index=True)
joined_example = df1.join(df2)

위의 예제에서, merge를 사용할 때는 left_indexright_index 파라미터를 True로 설정하여 인덱스를 기준으로 결합하도록 지정했습니다. 반면, join은 기본적으로 인덱스를 기준으로 작동하기 때문에 별도의 지정 없이 바로 사용할 수 있습니다.

요약하면, joinmerge 모두 강력한 데이터프레임 결합 도구이지만, 사용하는 상황과 요구 사항에 따라 적절한 방법을 선택하는 것이 중요합니다.

 

5. concat 함수를 사용한 결합

판다스의 concat 함수는 여러 데이터프레임 또는 시리즈를 특정 축을 따라 연결하는 데 사용됩니다. concat은 주로 수직 또는 수평 방향으로 데이터를 연결할 때 사용되며, 이를 통해 여러 조각의 데이터를 하나의 데이터프레임으로 통합할 수 있습니다.

 

5.1. 수직 및 수평 결합에 대한 설명

concat 함수를 사용하여 데이터를 수직 또는 수평 방향으로 연결할 수 있습니다.

  • 수직 결합: 두 개 이상의 데이터프레임을 위아래로 연결합니다. 이는 기본적인 동작 방식으로, 여러 데이터프레임에 걸쳐 있는 행을 하나의 데이터프레임으로 통합하는 데 사용됩니다.
  • 수평 결합: 두 개 이상의 데이터프레임을 좌우로 연결합니다. 이는 데이터프레임의 컬럼을 확장하는 데 사용됩니다.
import pandas as pd

# 예제 데이터프레임 생성
df1 = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
df2 = pd.DataFrame({'A': [7, 8, 9], 'B': [10, 11, 12]})

# 수직 결합 예제
vertical_concat = pd.concat([df1, df2])

# 수평 결합 예제
horizontal_concat = pd.concat([df1, df2], axis=1)

위의 예제에서, pd.concat([df1, df2])는 두 데이터프레임을 수직으로 연결하며, pd.concat([df1, df2], axis=1)는 두 데이터프레임을 수평으로 연결합니다.

 

5.2. axis 파라미터의 사용법

concat 함수의 axis 파라미터는 연결의 방향을 지정하는 데 사용됩니다. axis=0 (기본값)은 수직 연결을, axis=1은 수평 연결을 의미합니다.

# axis 파라미터를 사용한 수직 결합
vertical_axis_concat = pd.concat([df1, df2], axis=0)

# axis 파라미터를 사용한 수평 결합
horizontal_axis_concat = pd.concat([df1, df2], axis=1)

axis 파라미터를 통해 concat 함수의 연결 방향을 쉽게 제어할 수 있습니다. 따라서 데이터의 형태와 연결의 목적에 따라 적절한 방향을 선택하여 데이터를 효과적으로 통합할 수 있습니다.

 

6. 결합 시 발생할 수 있는 문제점 및 해결방법

데이터프레임을 결합할 때 다양한 문제가 발생할 수 있습니다. 이러한 문제를 효과적으로 해결하는 것은 데이터 분석의 정확성과 효율성을 보장하는 데 중요합니다.

 

6.1. 중복된 컬럼 이름 처리

두 데이터프레임을 결합할 때, 컬럼 이름이 중복되는 경우가 있습니다. 이럴 때 판다스는 자동으로 접미사를 추가하여 컬럼 이름을 구분합니다. 하지만 이러한 자동 접미사는 분석에 혼란을 줄 수 있으므로, 명시적으로 컬럼 이름을 지정하는 것이 좋습니다.

import pandas as pd

# 예제 데이터프레임 생성
df1 = pd.DataFrame({'key': ['A', 'B'], 'value': [1, 2]})
df2 = pd.DataFrame({'key': ['A', 'B'], 'value': [3, 4]})

# 중복된 컬럼 이름이 있는 데이터프레임 결합
merged_df = pd.merge(df1, df2, on='key', suffixes=('_left', '_right'))

위의 예제에서 suffixes 파라미터를 사용하여 중복된 컬럼 이름에 추가될 접미사를 지정했습니다.

 

6.2. NaN 값 처리

데이터프레임을 결합할 때, 일치하는 값이 없는 경우 NaN 값이 생성될 수 있습니다. 이러한 NaN 값은 데이터 분석에서 문제를 일으킬 수 있으므로 적절한 처리가 필요합니다.

# NaN 값이 있는 데이터프레임 예제
df_left = pd.DataFrame({'key': ['A', 'B', 'C'], 'value_left': [1, 2, 3]})
df_right = pd.DataFrame({'key': ['A', 'B', 'D'], 'value_right': [4, 5, 6]})
merged_df = pd.merge(df_left, df_right, on='key', how='outer')

# NaN 값 처리
merged_df.fillna(0, inplace=True)

위의 예제에서 fillna 메서드를 사용하여 NaN 값을 0으로 대체했습니다.

 

6.3. 인덱스 문제

데이터프레임을 결합할 때 인덱스가 불일치하거나 중복될 수 있습니다. 이러한 인덱스 문제를 해결하기 위해 재인덱싱을 수행할 수 있습니다.

# 인덱스 문제가 있는 데이터프레임 예제
df1 = pd.DataFrame({'A': [1, 2, 3]}, index=['a', 'b', 'c'])
df2 = pd.DataFrame({'B': [4, 5, 6]}, index=['b', 'c', 'd'])
joined_df = df1.join(df2, how='outer')

# 재인덱싱
joined_df.reset_index(drop=True, inplace=True)

위의 예제에서 reset_index 메서드를 사용하여 인덱스를 재설정했습니다.

 

7. 실제 예제를 통한 데이터프레임 결합

실제 데이터 분석에서 데이터프레임 결합은 필수적인 단계 중 하나입니다. 다음은 간단한 예제 데이터를 이용하여 merge, join, concat 함수의 사용법을 보여주는 예제입니다.

 

7.1. merge 사용 예제

import pandas as pd

# 예제 데이터프레임 생성
df_employee = pd.DataFrame({'emp_id': [101, 102, 103], 'name': ['Alice', 'Bob', 'Charlie']})
df_salary = pd.DataFrame({'emp_id': [101, 102, 104], 'salary': [50000, 60000, 70000]})

# merge 함수 사용
df_merged = pd.merge(df_employee, df_salary, on='emp_id', how='outer')

위의 예제에서는 직원 정보와 급여 정보를 포함하는 두 개의 데이터프레임을 emp_id를 기준으로 결합하였습니다.

 

7.2. join 사용 예제

df_orders_A = pd.DataFrame({'product': ['apple', 'banana'], 'amount': [5, 10]}, index=['storeA', 'storeA'])
df_orders_B = pd.DataFrame({'product': ['apple', 'cherry'], 'amount': [8, 3]}, index=['storeB', 'storeB'])

# join 함수 사용
df_joined = df_orders_A.join(df_orders_B, lsuffix='_A', rsuffix='_B')

위의 예제에서는 각 상점에서 주문된 제품 정보를 포함하는 데이터프레임을 결합하였습니다.

 

7.3. concat 사용 예제

df_2022 = pd.DataFrame({'month': ['Jan', 'Feb'], 'sales': [1000, 1200]})
df_2023 = pd.DataFrame({'month': ['Jan', 'Feb'], 'sales': [1100, 1250]})

# concat 함수 사용
df_sales = pd.concat([df_2022, df_2023], keys=['2022', '2023'])

위의 예제에서는 두 해의 판매 데이터를 연결하여 하나의 데이터프레임으로 만들었습니다.

 

8. 정리 및 결론

판다스를 사용한 데이터프레임 결합은 데이터 분석의 핵심 작업 중 하나입니다. 여러 출처에서 나온 데이터를 적절하게 결합하는 것은 분석의 효율성과 정확성을 크게 향상시킬 수 있습니다.

그러나 이 과정에서 발생할 수 있는 여러 문제점, 예를 들면 중복된 컬럼 이름, NaN 값, 인덱스 문제 등에 주의해야 합니다. 각 결합 방법의 특성을 잘 이해하고, 적절한 함수와 파라미터를 선택하는 것이 중요합니다.

마지막으로, 데이터프레임 결합은 단순한 연산이 아닌 데이터의 통합 및 변환 과정입니다. 따라서 이 과정을 통해 데이터의 품질을 향상시키고, 더욱 의미 있는 분석 결과를 도출할 수 있습니다.

 

아래 포스팅도 참고해 보세요!

 파이썬 OS라이브러리 알아보기
 Pandas 기초 살펴보기
 파이썬에서 그룹별 합계와 평균 구하기
 아나콘다 설치법
 파이썬을 활용한 GUI 개발: 라이브러리 선택 가이드
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기