카테고리 없음

2025.11.17 TIL (본캠프, 21일차)

D:Connect 2025. 11. 17. 21:21

새로운 한 주가 시작되었다. 4주차를 넘어 이제 5주차에 접어들었다는 것이 실감난다.

주말에는 SQL 문제를 5문제씩 풀며 손에 익숙해지도록 노력했다. 그리고 오늘 새로운 월요일, SQL 코드카타에서는 난이도가 Level 4까지 올라왔다.

5주차는 Python 데이터 전처리의 심화 단계다. 오늘 배운 내용들은 모두 실무에서 자주 사용되는 기법들이라고 한다.

 

 

주말에 SQL 문제를 5문제씩 풀었다. 단순한 추가 학습이 아니라 손에 익숙해지기 위한 의도적인 복습이었다.

지금까지의 경험으로 볼 때, 알고 있는 것과 실제로 할 수 있는 것 사이에는 큰 격차가 있었다. 격차를 줄이기 위해 반복 연습이 정말 중요하다.

 

SQL의 JOIN과 Python의 데이터 병합

Python에서도 SQL과 같은 개념으로 테이블을 병합하는 방법을 배웠다.. 하지만 방식은 다르다.

 

Merge() - SQL의 JOIN과 가장 유사

# 공통 컬럼을 기준으로 테이블 병합
result = df1.merge(df2, on='Customer_ID', how='inner')

 

주요 매개변수(파라미터):

# on: 조건 컬럼 지정
df1.merge(df2, on='Customer_ID')
df1.merge(df2, on=['ID', 'Date'])  # 여러 개일 경우 리스트

# how: 병합 방식 (SQL의 JOIN과 동일)
df1.merge(df2, on='ID', how='inner')   # 교집합만
df1.merge(df2, on='ID', how='left')    # 왼쪽 기준
df1.merge(df2, on='ID', how='right')   # 오른쪽 기준
df1.merge(df2, on='ID', how='outer')   # 합집합

# left_on / right_on: 기준 컬럼명이 다를 때
df1.merge(df2, left_on='UserID', right_on='CustomerID')

# suffixes: 중복된 컬럼명 처리
df1.merge(df2, on='ID', suffixes=('_left', '_right'))

# indicator: 병합 정보 표시
df1.merge(df2, on='ID', how='outer', indicator=True)
# 결과: _merge 컬럼에 'left_only', 'right_only', 'both' 표시

 

Join() - 인덱스 기준 병합

Join은 Merge보다 간단하지만 인덱스 기준으로만 작동한다. 그래서 사용에 있어서 제한적이다.

# 인덱스를 기준으로 병합 (컬럼명 불필요)
result = df1.join(df2, how='inner')

 

 

주요 매개변수:

# how: 병합 방식
df1.join(df2, how='inner')
df1.join(df2, how='left')

# lsuffix / rsuffix: 중복 컬럼명 처리
df1.join(df2, lsuffix='_left', rsuffix='_right')

# sort: 인덱스 정렬 여부
df1.join(df2, sort=True)

 

Concat() - 여러 데이터프레임 연결

Concat은 여러 개의 데이터프레임을 축을 따라 연결하는 방식이다. Merge나 Join과는 다르게 특정 조건이 필요 없다.

# 수직 결합 (행 기준)
result = pd.concat([df1, df2], axis=0)  # axis=0 기본값

# 수평 결합 (열 기준)
result = pd.concat([df1, df2], axis=1)

# 주요 매개변수
pd.concat([df1, df2], 
          axis=0,
          join='outer',          # 'inner'면 공통 컬럼만
          ignore_index=True,     # 인덱스 재배열
          keys=['df1', 'df2'])   # 데이터프레임 이름 지정

 

Append() - 행 기준 결합 (Concat의 간편판)

# df2의 행들을 df1에 추가
result = df1.append(df2)

# 주요 매개변수
df1.append(df2, ignore_index=True)  # 인덱스 재배열
df1.append(df2, sort=True)          # 컬럼 정렬

 

Merge vs Join vs Concat - 언제 어떤 것을 쓸까?

공통 컬럼 기준 병합 Merge
인덱스 기준 병합 Join
여러 데이터프레임 연결 Concat
행 추가 Append

 

Pivot Table - 엑셀 피벗 테이블의 Python 구현

개념: 데이터 재구성의 효과적인 방법

Pivot Table은 데이터의 구조를 완전히 변환한다. 행과 열, 값을 자유롭게 재배치할 수 있다.

# 기본 구조
result = df.pivot_table(
    index='Gender',      # 행으로 사용할 컬럼
    columns='Location',  # 열로 사용할 컬럼
    values='Salary',     # 값으로 사용할 컬럼
    aggfunc='mean'       # 계산 방식 (평균, 합계 등)
)

 

주요 매개변수:

# 기본 피벗 테이블
df.pivot_table(index='Gender', columns='Location', values='Salary')

# 여러 값에 대한 계산
df.pivot_table(
    index='Gender',
    values=['Salary', 'Bonus'],  # 여러 값 지정
    aggfunc='mean'
)

# 멀티 인덱스 (계층적 인덱스)
df.pivot_table(
    index=['Gender', 'Department'],  # 리스트로 여러 기준
    columns='Location',
    values='Salary'
)

# 다양한 계산 방식
df.pivot_table(index='Gender', columns='Location', 
               values='Salary', aggfunc='sum')     # 합계
df.pivot_table(index='Gender', columns='Location', 
               values='Salary', aggfunc='count')   # 개수
df.pivot_table(index='Gender', columns='Location', 
               values='Salary', aggfunc=['mean', 'std'])  # 여러 함수

 

 

추가 유용한 메서드들

Lambda - 이름 없는 함수의 강력함

# 개념: 간단한 함수를 한 줄로 정의
# 일반 함수
def add(x, y):
    return x + y

# 람다 함수
add_lambda = lambda x, y: x + y

# 실무 활용
df['new_column'] = df['Age'].apply(lambda x: x * 2)
df['category'] = df['Salary'].apply(lambda x: '고소득' if x > 5000 else '저소득')

 

Split - 문자열 분리

# 하나의 값으로 묶여있는 데이터 분리
# 예: "John,Smith" → "John", "Smith"

df['Name'].str.split(',', expand=True)
# sep: 구분자
# maxsplit: 최대 분리 횟수

result = df['Address'].str.split('/', n=2)  # 최대 2번 분리

 

rrule - 날짜 규칙 생성

from dateutil.rrule import rrule, DAILY, WEEKLY, MONTHLY

# 2025-01-01부터 2025-12-31까지 매일 생성
dates = list(rrule(DAILY, dtstart=datetime(2025, 1, 1), 
                   until=datetime(2025, 12, 31)))

# 매주 월요일만
dates = list(rrule(WEEKLY, dtstart=datetime(2025, 1, 1), 
                   count=10))  # 10개만

# 매 3개월마다
dates = list(rrule(MONTHLY, interval=3, 
                   dtstart=datetime(2025, 1, 1), count=4))

 

 

 

오늘부터 SQL 코드카타 Level 4에 진입했다. 난이도가 올라가서 5문제만 풀 수 있었다. 하지만 좋은 소식인거 같다.(성장했다는..)

처음 SQL을 배웠을 때는 기본 SELECT 문도 어려웠다. 지금은 복잡한 쿼리도 활용할 수 있는 수준에 도달했다는 뜻이 아닐까 싶다.

하지만 Python은 다르다. 오늘 배운 내용들은 정말 많고, 각각의 메서드들이 사용되는 상황도 다양하다.

  • Merge, Join, Concat, Append의 구분
  • Pivot Table의 유연한 사용
  • Lambda, Split, rrule 같은 추가 메서드들

이 모든 것을 한 번에 이해하기는 어려다는걸 절실히 깨달았다.

오늘 느낀 것은 "복습은 선택이 아닌 필수가 되었다"는 것이다.

지금까지는 새로운 것을 배우는 속도에 복습이 따라갈 수 있었다. 하지만 이제는 복습 없이는 불가능하다.

5주차의 첫날을 마무리하며....

  • SQL: Level 4 진입, 문제 난이도 상승
  • Python: 데이터 병합과 변환의 핵심 메서드 학습
  • 주말: 의도적인 SQL 복습

지난 4주는 기초를 다지는 단계였다면, 이제 5주차는 "정말로 실무에 쓰일 수 있는 기술"을 배우는 단계인거 같다.

하지만 그만큼 이해해야 할 것도, 복습해야 할 것도 많아졌다.

 

이번주 핵심 목표

  • SQL: Level 4 완전히 마스터하기
  • Python: Merge, Pivot Table 중심으로 복습 및 실습
  • 주말: 2시간 이상의 Python 데이터 병합 복습

5주차는 진정한 의미의 "데이터 분석" 능력이 형성되는 단계가 될 것 같다.

꼭 복습해서 최대한 이해하도록 노력해야겠다.