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를 사용하여 데이터를 변형하며, 시간 데이터를 처리함으로써 시간 기반 분석까지 효율적으로 수행할 수 있습니다.
'공부 > 판다스(Pandas)' 카테고리의 다른 글
Pandas와 함께 사용하면 좋은 라이브러리(NumPy, Matplotlib, Seaborn) (0) | 2024.10.23 |
---|---|
상관관계 분석의 다양한 방법/데이터 간의 관계를 이해하는 기법들 (1) | 2024.10.20 |
Pandas로 배우는 시계열 데이터 분석/날짜 및 시간 핸들링과 리샘플링 기법 (1) | 2024.10.19 |
Pandas로 배우는 기본 통계 함수와 심화 분석 함수 활용법 (0) | 2024.10.18 |
Pandas로 배우는 피벗 테이블과 교차 테이블/ 데이터 요약 및 관계 분석 (0) | 2024.10.17 |