Data_10기

Pandas 개인 과제 및 SQL 코드카타에 대한 회고

senu 2025. 12. 3. 23:14

오늘은 Python의 Pandas 개인과제와 SQL 코드카타를 동시에 진행하면서, 익숙하다고 생각했던 문법들 속에서 새로운 관점과 기능들을 많이 배우게 된 시간이었다.


Ⅰ. Pandas 개인 과제

1. Lambda 함수

파이썬의 lambda는 익명 함수를 만들 때 사용하는 문법이다. 과제에서는 특정 시간대를 기준으로 "아침/오후/저녁/밤"을 분류해야 했는데, 이럴 때 lambda로 코드를 깔끔하게 작성할 수 있었다.

 

lambda를 사용하는 이유

  • 짧은 조건 분기를 한 줄에 표현할 수 있음
  • 굳이 def 로 함수를 정의할 필요 없이 즉성에서 사용 가능
  • Pandas의 apply( )와 조합하면 직관적인 데이터 전처리 가능

과제 lambda 활용 예시

df['Time_Category'] = df['Dep_time'].dt.hour.apply(
    lambda h: '아침' if 5 <= h < 12
    else '오후' if 12 <= h < 18
    else '저녁' if 18 <= h < 24
    else '밤'
)

 

2. dt.day_name( )

이번 과제에서 특정 요일에 해당하는 항공편의 평균 가격을 구해야 하는 문제가 있었다. 평소에는 날짜 데이터를 문자 그대로 두거나 to_datetime( ) 함수만 사용했었는데, 요일이라는 새로운 변수(?)가 주어짐에 따라 새로운 함수도 같이 배워볼 수 있었다. pandas의 dt.day_name( )을 사용하면 날짜의 요일 이름(Monday, Wednesday, ...)을 알아서 구해준다.

 

과제 dt.day_name( ) 활용 예시

df['Date_of_Journey'] = pd.to_datetime(df['Date_of_Journey'], infer_datetime_format=True)

df[df['Date_of_Journey'].dt.day_name() == 'Wednesday']['Price'].mean()

 


Ⅱ. SQL 코드카타

SQL 코드카타를 진행하면서 레벨이 올라가서 그런지 한 문제에 소비하는 시간이 점점 길어진다. 고민이 길어지는 만큼 앞으로는 고민 과정이나 오답노트를 작성해 놓으면 도움이 될 것 같다는 생각이 들었다.

 

코드카타 1)

우유, 요거트가 모두 담긴 장바구니(cart_id)를 조회하는 문제에서, 조건을 구현하는 방법에 대해 고민이 길어졌다. where이나 having 절만 생각을 하다 도저히 답이 안 나와 힌트를 찾아보게 되었다. 이중 쿼리를 활용해서 문제를 풀면 두 조건을 모두 만족시킬 수 있었다. 조건을 각각 적용한 테이블을 inner join할 생각을 전혀 못 하고 있었기에 너무 신기했다.

select a.cart_id
from (  select cart_id, name
        from cart_products
        where name = 'Milk' ) as a
inner join (  select cart_id, name
              from cart_products
              where name = 'Yogurt' ) as b
on a.cart_id = b.cart_id
order by cart_id
;

 

 

코드카타 2)

조회수가 가장 높은 게시물의 첨부파일 경로를 조회하는 문제였다. 조회수가 가장 높은 게시글을 뽑는 과정에서 바보 같은 실수를 했다.

# 나의 잘못된 쿼리 1
select concat('/home/grep/src/',b.board_id, '/', b.file_id, b.file_name, b.file_ext) as file_path
from (  select board_id, max(views)
        from used_goods_board ) as a
inner join used_goods_file as b
on a.board_id = b.board_id
order by b.file_id desc
;

 

서브쿼리에 board_id와 max(views)를 함께 두면 max(views)의 board_id가 나올거라는 착각을 한 것이다. 이렇니 조회수가 가장 높은 게시글의 id가 제대로 추출되지 않아 제대로된 결과가 나오지 않았다.

 

다음 방법으로 group by 절과 having 절을 사용해 조건을 구현해보기로 했지만, 원하는 결과가 나오지 않았다.

# 나의 잘못된 쿼리 2
select concat('/home/grep/src/',b.board_id, '/', b.file_id, b.file_name, b.file_ext) as file_path
from used_goods_board as a
inner join used_goods_file as b
on a.board_id = b.board_id
group by a.board_id
having max(a.views)
order by b.file_id desc
;

 

그래서 또 힌트를 찾아보고 where절에 사용하는 중첩 쿼리를 사용해 조건을 구현했더니 정답처리가 되었다.

select concat('/home/grep/src/',b.board_id, '/', b.file_id, b.file_name, b.file_ext) as file_path
from used_goods_board as a
inner join used_goods_file as b
on a.board_id = b.board_id
where a.views = ( select max(views) from used_goods_board)
order by b.file_id desc
;

 


마무리

SQL 문제를 풀면서 오답노트를 할 생각을 못했는데 오늘 팀원들과 저녁 데일리 스크럼을 하면서 오답노트 했던 걸 AI에게 튜터의 페르소나를 부여해 자신에게 부족한 부분을 효율적으로 복습할 수 있도록 도움을 받고 있다는 말을 들었다. 그동안에 사소한 고민이나 어떤 개념에 대해 내가 이해한 느낌들을 잘 정리해뒀다면 나도 그런 방법으로 효율적으로 복습을 해볼 수 있었겠다는 생각이 들었다. 전 팀에서는 그날의 회고를 공유하 스크럼 시간이 없어 다른 사람들의 경험을 들을 기회가 없었는데, 이번에는 들을 수 있어 도움이 많이 되는 것 같다. 이런 부분에서 소통이 정말 중요하다는 것을 다시 한 번 더 느끼게 되었다.