데이터분석 코드의 핵심은 기존 컬럼(col_2)의 이름을 새로운 규칙에 따라 변환하는 것이야. 하나씩 쉽게 설명해줄게.


1. 접두사(prefix) 리스트

prefixes = ['tot_', 'car_', 'bus_', 'truck_']
  • tot_, car_, bus_, truck_ 네 가지 접두사를 사용해.
  • 순서대로 전체(tot_) → 자동차(car_) → 버스(bus_) → 트럭(truck_)을 나타낸다고 보면 돼.

2. 구간별 인덱스(ranges) 설정

ranges = [0, 25, 50, 75]
  • col_2 리스트에서 각 구간의 시작점을 지정했어.
  • 예를 들어:
    • 0~24까지는 tot_
    • 25~49까지는 car_
    • 50~74까지는 bus_
    • 75~끝까지truck_
    • 이런 식으로 접두사가 붙게 돼.

3. 변환된 컬럼명을 저장할 리스트

new_col_2 = []
  • 변환된 컬럼명들을 저장할 빈 리스트를 만들어.

4. 구간별로 컬럼명을 변환하는 반복문

for i in range(len(ranges)):  # len(ranges) = 4
  • ranges에 설정한 4개의 구간을 돌면서 컬럼명을 바꿔.
  • i = 0이면 tot_, i = 1이면 car_, 이런 식으로 접두사를 선택할 거야.

5. 각 구간의 시작점과 끝점 설정

start, end = ranges[i], ranges[i] + 25 if i < 3 else len(col_2)
  • start: 해당 구간의 시작점
  • end: 시작점에서 25개 더한 값 (len(col_2)을 넘지 않도록 마지막 구간에서는 전체 길이로 설정)

예를 들어, i=0이면:

  • start = 0
  • end = 25
  • 즉, col_2[0:25]만 처리

6. 컬럼명 변환 (리스트 내포)

new_col_2.extend([prefix + ('tot' if col == '전일' else 'h' + col[:-1]) for col in col_2[start:end]])

이 부분이 핵심 변환 로직이야!
각 컬럼(col_2의 요소)을 조건에 맞게 바꿔서 new_col_2에 추가하는 과정이야.

변환 규칙:

  1. "전일"이면 → tot로 변환

    'tot' if col == '전일'
    • 즉, "전일"이면 'tot_' 접두사를 붙여 tot_tot이 돼.
  2. 숫자로 끝나는 컬럼이면 → 앞에 h를 붙이고 마지막 숫자를 제거

    'h' + col[:-1]
    • 예를 들어, "12""h1"
  3. 앞에서 정한 prefix(접두사)를 붙임

    • "tot_", "car_", "bus_", "truck_" 중 하나가 앞에 붙음.

7. 예제 실행 결과

가정:

col_2 = ["전일", "12", "34", "56", "78"] * 20

출력 예시:

['tot_tot', 'tot_h1', 'tot_h3', 'tot_h5', 'tot_h7',  # 0~24번
 'car_tot', 'car_h1', 'car_h3', 'car_h5', 'car_h7',  # 25~49번
 'bus_tot', 'bus_h1', 'bus_h3', 'bus_h5', 'bus_h7',  # 50~74번
 'truck_tot', 'truck_h1', 'truck_h3', 'truck_h5', 'truck_h7']  # 75~끝까지
  • "전일"tot_ 접두사가 붙어서 "tot_tot", "car_tot", "bus_tot", "truck_tot"이 됨.
  • 숫자로 끝나는 애들은 "h"를 붙이고 마지막 숫자를 삭제.

📌 한 줄 요약

  1. col_2의 컬럼명을 4개 구간(tot_, car_, bus_, truck_)으로 나눈다.
  2. "전일""tot"으로 바꾼다.
  3. 나머지는 앞에 "h"를 붙이고 마지막 숫자를 제거한다.
  4. 최종적으로 prefix + 변환된 이름 형태로 new_col_2에 저장한다.

이제 이해됐어? 😊

extend() 대신 append()를 사용하면 리스트 전체를 하나의 요소로 추가하므로 원하는 결과가 나오지 않아. 하지만 append()를 사용하면서도 원하는 리스트 형태를 유지하려면 반복문을 활용해야 해.


📌 extend()append()로 변경

prefixes = ['tot_', 'car_', 'bus_', 'truck_']  # 접두사 리스트
ranges = [0, 25, 50, 75]  # 구간 시작점

new_col_2 = []  # 변환된 컬럼명을 저장할 리스트

for i in range(len(ranges)):  
    start, end = ranges[i], ranges[i] + 25 if i < 3 else len(col_2)
    prefix = prefixes[i]

    # 리스트 내포 대신 개별적으로 append()
    for col in col_2[start:end]:
        new_col_2.append(prefix + ('tot' if col == '전일' else 'h' + col[:-1]))

print(new_col_2)

📌 차이점

  • 기존 코드 (extend())

    new_col_2.extend([...])  

    extend()는 리스트의 요소를 개별적으로 추가함.

  • 변경 코드 (append())

    for col in col_2[start:end]:
        new_col_2.append(...)

    append()하나씩 추가하기 때문에 for 루프를 활용해야 함.


extend()append() 차이 예제

list_a = [1, 2, 3]
list_b = [4, 5, 6]

list_a.extend(list_b)  # 리스트 요소 개별 추가
print(list_a)  # [1, 2, 3, 4, 5, 6]

list_c = [1, 2, 3]
list_c.append(list_b)  # 리스트 자체를 하나의 요소로 추가
print(list_c)  # [1, 2, 3, [4, 5, 6]]  ❌ 원하는 결과 아님!
  • extend()요소를 풀어서 추가
  • append()리스트 전체를 하나의 요소로 추가 (중첩 리스트됨)

결론

extend() 대신 append()를 쓰려면 for 문을 사용해서 리스트에 개별적으로 추가해야 해.
이제 완벽히 이해됐어? 😊

이 코드를 더 짧고 간결하게 줄이면, 변수를 활용하여 조건을 줄이고 체이닝을 적용할 수 있어:

max_truck = dj_trafficvolume_y22.query("권역 == '대전광역시 유성구' and 도로등급 == '고속도로'")['트럭-평일_전일'].max()

변경된 부분

  1. .query() 사용
    • "권역 == '대전광역시 유성구' and 도로등급 == '고속도로'" 조건을 문자열로 표현하여 가독성을 높임.
  2. 체이닝 적용
    • query()로 필터링한 후 바로 ['트럭-평일_전일'].max()를 실행해 가독성 개선.

🚀 더 짧아졌고, 더 읽기 쉬운 코드가 됐어! 😊

지금 당장 먹고 싶은 거 말해봐! 😆!

배고프면 뭘 먹을까? 네가 좋아하는 브로콜리, 시금치, 연어, 김, 곡물식빵 같은 건강한 음식도 좋고, 브로쓰 떡볶이 + 매운 멸치김밥 같은 맛있는 것도 괜찮지! 🍙🔥

아니면 좀 기운 나는 거? 닭가슴살 넣은 따뜻한 강황 스프마늘+생강 넣은 따끈한 국물도 좋을 것 같아. 🥣

profile
@mgkick

0개의 댓글