본문 바로가기

공부/판다스(Pandas)

Pandas 기능(병합, 데이터 변형, 시간 데이터 처리)

Pandas는 데이터를 처리하고 분석하는 데 매우 유용한 도구입니다. 기본적인 데이터 조작 외에도, 고급 기능을 통해 더 복잡하고 효율적인 작업을 수행할 수 있습니다. 이 글에서는 Pandas의 고급 기능 중에서도 병합 및 조인, 데이터 변형, 시간 데이터 처리에 대해 자세히 설명하겠습니다.

1. 병합 및 조인 (Merge, Join)

데이터 분석 작업을 할 때, 여러 개의 데이터셋을 병합하여 사용할 필요가 종종 있습니다. Pandas는 SQL에서 사용하는 JOIN과 유사한 방식으로 두 개 이상의 데이터셋을 병합할 수 있는 다양한 기능을 제공합니다.

병합 (Merge)

merge() 함수는 공통된 열 또는 인덱스를 기준으로 두 데이터 프레임을 병합하는 데 사용됩니다. 기본적으로는 교집합 방식(inner join)을 사용하지만, 외집합(outer join), 왼쪽 조인(left join), 오른쪽 조인(right join)도 지원합니다.

 

예시 코드 및 설명

import pandas as pd

# 예시 데이터프레임 생성
df1 = pd.DataFrame({
    'ID': [1, 2, 3, 4],
    'Name': ['Alice', 'Bob', 'Charlie', 'David']
})

df2 = pd.DataFrame({
    'ID': [3, 4, 5, 6],
    'Score': [85, 90, 78, 92]
})

# ID를 기준으로 병합 (inner join)
merged_df = pd.merge(df1, df2, on='ID', how='inner')
print(merged_df)

 

코드 설명

  • 데이터프레임 생성: df1과 df2는 공통된 열(ID)을 포함하는 두 개의 데이터 프레임입니다.
  • 병합 수행: pd.merge(df1, df2, on='ID', how='inner')는 ID 열을 기준으로 두 데이터프레임을 병합합니다. how='inner'는 두 데이터 프레임에서 교집합만 병합한다는 의미입니다.
  • 결과 출력: 공통된 ID 값(3, 4)에 해당하는 데이터가 병합된 결과를 출력합니다.

조인 (Join)

join() 함수는 데이터 프레임 간의 인덱스를 기준으로 병합할 때 사용됩니다. 이 방식은 인덱스를 기준으로 데이터를 연결하므로, 데이터를 정렬하거나 인덱스별로 결합해야 할 때 유용합니다.

 

예시 코드

# 인덱스를 기준으로 join
df1 = df1.set_index('ID')
df2 = df2.set_index('ID')

joined_df = df1.join(df2, how='inner')
print(joined_df)

 

코드 설명

  • set_index()로 ID를 인덱스로 설정한 후, join()을 사용하여 두 데이터프레임을 병합합니다. how='inner'는 두 데이터프레임의 인덱스가 일치하는 부분만 결합하겠다는 의미입니다.

2. 데이터 변형 (Apply, Map, Lambda)

Pandas의 데이터 프레임은 기본적인 데이터 조작뿐 아니라 데이터를 유연하게 변형할 수 있는 다양한 기능을 제공합니다. 대표적으로 apply(), map(), lambda 등을 사용하여 데이터를 변환하거나 계산할 수 있습니다.

apply() 함수

apply()는 데이터프레임이나 시리즈에 함수(사용자 정의 함수 포함)를 적용할 수 있습니다. 이 함수는 각 열 또는 각 행에 대해 반복적으로 함수를 실행하여 새로운 데이터를 생성합니다.

 

예시 코드

# 각 값에 제곱 값을 적용
df = pd.DataFrame({
    'A': [1, 2, 3],
    'B': [4, 5, 6]
})

df['A_squared'] = df['A'].apply(lambda x: x**2)
print(df)

 

코드 설명

  • 데이터프레임 생성: 'A'와 'B'라는 두 열을 가진 간단한 데이터프레임을 생성합니다.
  • lambda 함수 사용: apply()와 lambda 함수를 사용하여 'A' 열의 각 값을 제곱한 결과를 새로운 열 A_squared로 추가합니다.

map() 함수

map() 함수는 시리즈 객체에만 사용할 수 있으며, 각 요소에 대해 함수를 적용하거나 딕셔너리 또는 매핑 객체를 이용해 값 변환을 할 수 있습니다.

 

예시 코드

# 값 변환을 위한 딕셔너리 매핑
df['Name_Upper'] = df['Name'].map({'Alice': 'ALICE', 'Bob': 'BOB', 'Charlie': 'CHARLIE'})
print(df)

 

코드 설명

  • map()을 사용하여 'Name' 열의 값을 주어진 딕셔너리에 따라 대문자로 변환합니다. 딕셔너리에서 정의된 값들만 변환됩니다.

3. 시간 데이터 처리

Pandas는 시간 데이터를 처리하는 데 매우 강력한 도구입니다. 날짜와 시간을 다룰 수 있는 다양한 함수를 제공하며, 이를 통해 시간 기반 데이터 분석이 가능합니다.

시간 데이터 변환

Pandas의 pd.to_datetime() 함수는 문자열로 된 날짜 데이터를 실제 datetime 객체로 변환합니다.

 

예시 코드

# 날짜 문자열을 datetime 형식으로 변환
df = pd.DataFrame({
    'Date': ['2024-01-01', '2024-02-15', '2024-03-10']
})

df['Date'] = pd.to_datetime(df['Date'])
print(df)

 

코드 설명

  • 날짜 문자열 변환: 'Date' 열의 문자열 날짜를 pd.to_datetime() 함수를 사용하여 datetime 형식으로 변환합니다. 이렇게 변환하면 날짜 연산 및 필터링이 가능해집니다.

날짜 필터링 및 연산

datetime으로 변환된 날짜 데이터는 간단한 연산이나 필터링 작업을 수행할 수 있습니다.

 

예시 코드

# 날짜 필터링: 2024년 이후의 데이터만 선택
filtered_df = df[df['Date'] > '2024-02-01']
print(filtered_df)

 

코드 설명

  • df['Date'] > '2024-02-01'는 2024년 2월 1일 이후의 데이터를 필터링합니다. 날짜가 datetime 형식이므로 비교 연산이 가능해집니다.

날짜별 차이 계산

# 날짜 간 차이 계산
df['Today'] = pd.to_datetime('2024-04-01')
df['Days_Since'] = df['Today'] - df['Date']
print(df)

 

코드 설명

  • df['Today'] 열에 현재 날짜를 추가하고, df['Date']와의 차이를 계산하여 Days_Since 열에 각 날짜 간의 차이를 저장합니다. datetime 객체 간의 차이는 자동으로 timedelta 객체로 계산됩니다.

결론

Pandas는 기본적인 데이터 조작에서 고급 기능을 제공하여 더욱 복잡한 데이터 분석을 쉽게 할 수 있게 합니다. 데이터 병합 및 조인을 통해 여러 데이터셋을 결합하고, apply(), map(), lambda를 사용하여 데이터를 변형하며, 시간 데이터를 처리함으로써 시간 기반 분석까지 효율적으로 수행할 수 있습니다.