본문 바로가기
개발&프로그래밍

[Python] Pandas DataFrame

by 재아군 2024. 11. 19.

[Python] Pandas DataFrame

Pandas는 데이터 분석을 위한 Python 필수 라이브러리다.

DataFrame을 효과적으로 다루는 방법부터 고급 기능까지 상세히 알아보자.

 

 

데이터 전처리

기본적인 데이터 로딩과 확인

import pandas as pd

# CSV 파일 로딩
df = pd.read_csv('data.csv')

# 데이터 기본 정보 확인
print(df.info())
print(df.describe())

# 중복 행 확인 및 제거
duplicates = df.duplicated()
df_clean = df.drop_duplicates()

컬럼 처리

# 컬럼 이름 변경
df = df.rename(columns={
    'old_name': 'new_name',
    'price': 'item_price'
})

# 불필요한 컬럼 제거
df = df.drop(['unused_column', 'temp'], axis=1)

# 컬럼 타입 변환
df['price'] = df['price'].astype('float')
df['date'] = pd.to_datetime(df['date'])

데이터 필터링

# 조건별 필터링
mask = (df['price'] > 1000) & (df['category'] == 'electronics')
filtered_df = df[mask]

# isin 활용
valid_categories = ['A', 'B', 'C']
df = df[df['category'].isin(valid_categories)]

# 문자열 필터링
contains_text = df['description'].str.contains('sale', case=False)

Missing Value 처리

Missing Value 확인

# missing value 개수 확인
missing_count = df.isnull().sum()

# missing value 비율 확인
missing_ratio = (df.isnull().sum() / len(df)) * 100

# missing value가 있는 행 확인
rows_with_missing = df[df.isnull().any(axis=1)]

Missing Value 처리 방법

# missing value 제거
df_clean = df.dropna()
df_clean = df.dropna(subset=['important_column'])

# missing value 채우기
df['column'].fillna(0)  # 특정값으로 채우기
df['column'].fillna(df['column'].mean())  # 평균값으로 채우기
df['column'].fillna(method='ffill')  # 앞의 값으로 채우기
df['column'].fillna(method='bfill')  # 뒤의 값으로 채우기

# 보간법 사용
df['column'].interpolate(method='linear')

고급 Missing Value 처리

# 조건부 missing value 채우기
def fill_missing(row):
    if pd.isnull(row['value']):
        if row['category'] == 'A':
            return 10
        else:
            return 20
    return row['value']

df['value'] = df.apply(fill_missing, axis=1)

그룹 연산

기본 그룹화

# 단일 컬럼 그룹화
grouped = df.groupby('category')
group_means = grouped.mean()

# 다중 컬럼 그룹화
grouped = df.groupby(['category', 'region'])

집계 함수 활용

# 여러 집계 함수 동시 적용
summary = df.groupby('category').agg({
    'price': ['mean', 'min', 'max', 'count'],
    'quantity': 'sum'
})

# 사용자 정의 집계 함수
def custom_metric(x):
    return x.max() - x.min()

result = df.groupby('category')['price'].apply(custom_metric)

그룹 변환과 필터링

# 그룹별 변환
normalized = grouped.transform(lambda x: (x - x.mean()) / x.std())

# 그룹 필터링
filtered = grouped.filter(lambda x: len(x) > 5)  # 그룹 크기가 5보다 큰 경우만

시계열 데이터 처리

날짜/시간 변환

# 문자열을 날짜로 변환
df['date'] = pd.to_datetime(df['date'])

# 날짜 컴포넌트 추출
df['year'] = df['date'].dt.year
df['month'] = df['date'].dt.month
df['day'] = df['date'].dt.day
df['weekday'] = df['date'].dt.day_name()

시계열 리샘플링

# 일별 데이터를 월별로 변환
monthly = df.resample('M', on='date').mean()

# 시간별 데이터를 일별로 변환
daily = df.resample('D', on='datetime').sum()

# 특정 기간 선택
mask = (df['date'] >= '2023-01-01') & (df['date'] <= '2023-12-31')
df_2023 = df.loc[mask]

시계열 분석

# 이동평균 계산
df['MA7'] = df['value'].rolling(window=7).mean()
df['MA30'] = df['value'].rolling(window=30).mean()

# 성장률 계산
df['growth_rate'] = df['value'].pct_change()

# 시차 변수 생성
df['lag1'] = df['value'].shift(1)
df['lag7'] = df['value'].shift(7)

성능 최적화 팁

  1. 메모리 사용량 줄이기
df['category'] = df['category'].astype('category')
df['small_int'] = df['small_int'].astype('int32')
  1. 연산 최적화
# apply 대신 vectorized 연산 사용 
# 나쁜 예 
df['new_col'] = df['col'].apply(lambda x: x * 2) 
# 좋은 예
df['new_col'] = df['col'] * 2
  1. 대용량 데이터 처리
# 청크 단위로 처리
chunks = pd.read_csv('large_file.csv', chunksize=10000)
for chunk in chunks:
    process_chunk(chunk)

댓글