내일배움캠프

[내일배움캠프] TIL 20일차 26.01.20(화)

nom_de_plume 2026. 1. 20. 15:49

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를 잘 해낼 수 있을 것 같다. 파이썬 사고가 잘 안되서 문제다. 파이썬 코드카타가 아무리해도 사고가 너무 잘 안된다. 이건 한 번 여쭤봐야겠다..