Pandas
- 핵심구조
- Series (시리즈): 1차원 배열 형태 (엑셀의 '열' 형태)
- DataFrame (데이터프레임): 2차원 표 형태 (엑셀의 시트 전체)
1. 날짜 데이터 처리 (.dt 접근자)
- 날짜 형식(datetime)으로 된 컬럼에서 특정 정보만 추출할 때 사용
- 문자열 날짜를 반드시 datetime으로 변환 후 사용해야한다.
- 날짜 기반 파생 컬럼 생성에 필수
df['date'] = pd.to_datetime(df['date'])
- dt.year / dt.month: 연도와 월을 숫자로 반환
df['year'] = df['date'].dt.year
df['month'] = df['date'].dt.month
- dt.day_name(): 해당 날짜의 요일을 영문 문자열(ex: 'Monday')로 반환
df['weekday'] = df['date'].dt.day_name()
- df.to_period(freq): 날짜 데이터를 특정 주기(연별 'Y', 월별 'M', 일별 'D')로 반환 (기간별 통계낼 때 유용)
# 예시: 2024-05-20 -> 2024-05 (월 단위 기간으로 변환)
df['month_period'] = df['date_column'].dt.to_period('M')
2. 데이터 변환 및 매핑 (.apply, .map)
- 함수를 데이터프레임이나 시리즈의 각 요소에 적용
- axis 옵션으로 행/열 방향 제어
- .apply(func): 행(row) 또는 열(column) 단위로 복잡한 함수를 적용
df['new'] = df['old'].apply(func)
=> 행 단위 적용:
df['sum'] = df.apply(lambda x: x['a'] + x['b'], axis=1)
=> 열 단위 적용:
df['sum'] = df.apply(lambda x: x['a'] + x['b'], axis=0)
- .str.startswith(): 문자열 데이터를 조건에 따라 True/False로 변환
- 문자열 Series에서 특정 문자열로 시작하는지를 판별
- 필터링과 분류 작업에서 매우 빈번하게 사용
Series.str.startswith(pat, na=None)
- pat 옵션: 문자열이 시작하는지 확인할 패턴 (문자열 또는 튜플)
- na 옵션: 값이 NaN일 때 반환할 값 (True 또는 False 지정 가능)
.str.contains():
- 문자열에 특정 패턴이 포함되어 있는지 여부(True/False) 를 반환
Series.str.contains(pat, case=True, na=None, regex=True)
- pat: 찾을 문자열 또는 정규표현식
- case 옵션: 대소문자 구분 여부
- na 옵션: NaN일 경우 반환할 값
- regex 옵션: 정규표현식 사용 여부
.notna():
- 값이 결측값이 아닌 경우 True 반환
- 결측값이면 False 반환
Series.notna()
DataFrame.notna()
- NaN, None, <NA> 모두 탐지 가능
- 결측값 필터링에 자주 사용
- .isna()와 반대 개념
.str.extract( , expand=False):
- 문자열에서 정규표현으로 특정 패턴 추출
Series.str.extract(pat, expand=True)
- pat: 추출할 정규표현식 (그룹 포함)
- expand 옵션:
- True : DataFrame 반환
- False : Series 반환
- .map(dict or func): 주로 시리즈(한 컬럼)에서 값을 치환하거나 간단한 함수 적용에 사용
- 딕셔너리 기반 치환에 매우 유용
- DataFrame 전체에는 사용 불가
=> 딕셔너리 매핑
grade_map = {'A': 90, 'B': 80}
df['score'] = df['grade'].map(grade_map)
=> 함수 적용
df['len'] = df['name'].map(len)
- 사용자 정의 함수 예시 (to bool)
- to_bool 함수: 지저분한 문자열 데이터를 논리형(True/False)으로 정제
def to_bool(x):
if isinstance(x, bool):
return x
x = str(x).strip().lower()
return x in ["true", "1", "yes", "y"]
# 적용 방법
df['is_member'] = df['member_raw'].apply(to_bool)
3. 조건부 처리 및 집계 (np.where, .agg)
- np.where(조건, x, y): 조건이 참이면 x, 거짓이면 y를 반환 (엑셀의 IF 함수와 동일.)
import numpy as np
df['grade'] = np.where(df['score'] >= 80, 'Pass', 'Fail')
- .agg(): 여러 개의 집계 함수(sum, mean, max 등)를 한꺼번에 적용
- 그룹 분석에 필수
- 다양한 통계치 동시 산출
- 가독성 우수
=> 기본 문법
df.groupby('category')['price'].agg(['mean', 'sum', 'count'])
=> 함수 지정
df.agg({'price': ['mean', 'max'], 'qty': ['sum']})
4. 구조 변경 및 결합 (.pivot, .merge)
- .pivot(index, columns, values): 데이터의 형태를 재구성하여 '피벗 테이블' 생성
- 행/열 재구조화
- 집계 기능 없음
- 시각화 유용
df.pivot(index='date', columns='category', values='sales')
- .merge(df1, df2): 두 개의 데이터프레임을 특정 키(Key)를 기준으로 합친다. (SQL의 JOIN과 동일.)
- 다양한 조인 방식 지원 (inner(교집합), left(왼쪽 기준), right(오른쪽 기준), outer(전체) )
- 다양한 데이터 처리에 적합
pd.merge(df1, df2, on='id', how='inner')
5. 운영체제 제어 (os.makedirs)
- os.makedirs(path, exist_ok=True): 분석 결과를 저장할 폴더 자동 생성
- 파이썬으로 파일 시스템 제어 가능
- 실무 자동화 필수 기능
- exist_ok=True 옵션: 폴더가 이미 존재하더라도 에러 발생시키지 않고 넘어간다.
- 결과 저장용 자동 폴더 생
- exist_ok=False 옵션: 폴더가 이미 존재한다면 FileExistsError 발생한다.
- 중복 생성 방지
- 초기화 검증용
import os
os.makedirs('output/result', exist_ok=True)
오늘의 회고
판다스가 파이썬보다는 쉬운 것 같다. 판다스는 사고만 된다면 EDA를 잘 해낼 수 있을 것 같다. 파이썬 사고가 잘 안되서 문제다. 파이썬 코드카타가 아무리해도 사고가 너무 잘 안된다. 이건 한 번 여쭤봐야겠다..
'내일배움캠프' 카테고리의 다른 글
| [내일배움캠프] TIL 22일차 26.01.22(목) (0) | 2026.01.22 |
|---|---|
| [내일배움캠프] TIL 21일차 26.01.21(수) (0) | 2026.01.21 |
| [내일배움캠프] TIL 19일차 26.01.19(월) (0) | 2026.01.19 |
| [내일배움캠프] TIL 18일차 26.01.16(금) (1) | 2026.01.16 |
| [내일배움캠프] TIL 17일차 26.01.15(목) (1) | 2026.01.15 |