Pandas - 6. 데이터 연산

2025. 2. 8. 12:18프로그래밍 (확장)/Python-Pandas

Pandas에서는 다양한 데이터 연산을 수행할 수 있습니다. 이 문서에서는 기본적인 수치 연산부터 문자열 데이터 처리, 그룹화 및 집계, 윈도우 연산까지 초보자가 이해하기 쉽게 설명하고, 예제와 함께 각 개념을 소개합니다.


1. 수치 연산

Pandas를 이용하면 데이터프레임 내에서 다양한 수치 연산을 쉽게 수행할 수 있습니다.

1.1 기본 연산 (합계, 평균, 최소/최대값)

import pandas as pd
import numpy as np

# 샘플 데이터 생성
data = {'이름': ['철수', '영희', '민수', '지연', '현우'],
        '국어': [90, 85, 88, 76, 95],
        '수학': [80, 90, 95, 85, 100]}
df = pd.DataFrame(data)

# 기본 연산 수행
print("과목별 합계:")
print(df[['국어', '수학']].sum())
# 출력 예시:
# 국어    434
# 수학    450

print("\n과목별 평균:")
print(df[['국어', '수학']].mean())

print("\n과목별 최소값:")
print(df[['국어', '수학']].min())

print("\n과목별 최대값:")
print(df[['국어', '수학']].max())

1.2 누적 연산 (cumsum, cumprod)

# 누적 합
print("\n국어 점수 누적 합:")
print(df['국어'].cumsum())

# 누적 곱
df['누적 곱'] = df['국어'].cumprod()
print("\n국어 점수 누적 곱:")
print(df[['이름', '누적 곱']])

2. 문자열 데이터 처리

Pandas에서는 문자열 데이터를 다룰 수 있도록 다양한 문자열 함수를 제공합니다.

2.1 문자열 함수 (str.contains, str.replace 등)

# 샘플 데이터 생성
df['학교'] = ['서울고', '부산고', '대구고', '광주고', '서울고']

# 특정 문자열 포함 여부 확인
print("\n서울이 포함된 학교명:")
print(df['학교'].str.contains('서울'))

# 문자열 치환
df['학교'] = df['학교'].str.replace('고', '고등학교')
print("\n학교명 변경 후:")
print(df[['이름', '학교']])

2.2 정규식을 활용한 데이터 정제

# 특수문자 제거
df['이름'] = df['이름'].str.replace(r'[^가-힣]', '', regex=True)
print("\n특수문자 제거 후:")
print(df['이름'])

3. 그룹화 및 집계

3.1 그룹화 (groupby)

# 그룹화 예제
grouped = df.groupby('학교')
print("\n학교별 학생 수:")
print(grouped.size())

3.2 그룹화 후 집계 (mean, sum 등)

# 그룹별 평균
print("\n학교별 국어 점수 평균:")
print(grouped['국어'].mean())

3.3 사용자 정의 집계 함수 생성

# 사용자 정의 함수 (최대-최소 차이)
def range_func(x):
    return x.max() - x.min()

print("\n학교별 국어 점수 범위:")
print(grouped['국어'].agg(range_func))

3.4 그룹 연산의 최적화 기법

그룹 연산 최적화 기법: agg() 함수를 활용하면 여러 개의 집계 연산을 한 번에 수행할 수 있어 성능이 향상됩니다.

# 여러 개의 집계 연산 한 번에 수행
print("\n학교별 국어 점수 집계:")
print(grouped[['국어']].agg(['mean', 'sum', 'max', 'min']))

4. 윈도우 연산

4.1 롤링 윈도우 (rolling)

NaN 발생 이유: 롤링 윈도우 연산은 지정된 window 크기만큼의 데이터가 확보될 때까지 NaN 값을 반환합니다.

# 이동 평균 계산 (윈도우 크기: 2)
df['국어_이동평균'] = df['국어'].rolling(window=2).mean()
print("\n국어 점수 이동 평균:")
print(df[['이름', '국어', '국어_이동평균']])

4.2 확장 윈도우 (expanding)

Expanding 연산 동작 원리: Expanding 연산은 초기부터 현재 행까지의 모든 데이터를 포함하여 점진적으로 계산됩니다. 예시:

  1. 1번째 값: 90 (첫 값)
  2. 2번째 값: (90 + 85) / 2 = 87.5
  3. 3번째 값: (90 + 85 + 88) / 3 = 87.67
  4. 4번째 값: (90 + 85 + 88 + 76) / 4 = 84.75
  5. 5번째 값: (90 + 85 + 88 + 76 + 95) / 5 = 86.8
# 누적 평균 계산
df['국어_누적평균'] = df['국어'].expanding().mean()
print("\n국어 점수 누적 평균:")
print(df[['이름', '국어', '국어_누적평균']])

5. 요약 및 결론

  • 수치 연산: sum(), mean(), min(), max(), cumsum(), cumprod() 등을 활용해 데이터를 연산할 수 있음.
  • 문자열 처리: str.contains(), str.replace(), 정규식을 활용하여 문자열 데이터를 정제 가능.
  • 그룹화 및 집계: groupby()를 이용하여 데이터를 그룹화하고 집계 연산 수행 가능.
  • 윈도우 연산: rolling(), expanding()을 이용하여 이동 평균 및 확장 연산 수행 가능.