[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)
성능 최적화 팁
- 메모리 사용량 줄이기
df['category'] = df['category'].astype('category')
df['small_int'] = df['small_int'].astype('int32')
- 연산 최적화
# apply 대신 vectorized 연산 사용
# 나쁜 예
df['new_col'] = df['col'].apply(lambda x: x * 2)
# 좋은 예
df['new_col'] = df['col'] * 2
- 대용량 데이터 처리
# 청크 단위로 처리
chunks = pd.read_csv('large_file.csv', chunksize=10000)
for chunk in chunks:
process_chunk(chunk)
'개발&프로그래밍' 카테고리의 다른 글
[python] 리스트와 딕셔너리 완벽 이해하기 (0) | 2024.11.20 |
---|---|
[Python] Matplotlib으로 데이터 시각화하기 (0) | 2024.11.19 |
[Python] NumPy 배열 연산 마스터하기 (0) | 2024.11.18 |
[JAVA] ThreadLocal 제대로 사용하기 (0) | 2024.11.17 |
[JAVA] 효과적인 예외 처리 전략 (0) | 2024.11.16 |
댓글