12주차 마지막 날. 프로젝트 기간이 약 1/3 지났고, 프로젝트 기획서 작성을 완료했다.
학습 내용
pandas DataFrame의 행 반복 처리하기
- 데이터 탐색 중, 특정 지표값 계산에 데이터프레임의 각 행마다 특정 컬럼의 값에 따라 조건부로 수식을 적용해야 일이 생겼다.
- 투숙 완료한 고객으로 인해 발생한 실제 매출 또는 취소된 예약이지만 환불 불가하여 매출로 집계된 경우에만 매출로 계산하고, 그 외에는 0으로 출력하여 실제 발생된 매출을 새로운 컬럼으로 만들어야 했다. 요약한 조건절은 아래와 같다.
1. 예약 상태가 '체크 아웃' 일 경우: '평균 객실 단가' * '숙박일수' 2. 취소 여부가 '취소' & 보증금이 '환불 불가' 일 경우: '평균 객실 단가' * '숙박일수' 3. 그 외: 0
- 코드 작성이 어려워서 튜터님께 도움을 요청했고, 각 컬럼을 list로 변환한 뒤 for문으로 결과를 출력하는 방법과 함께
iterrows
라는 메서드를 알려주셨다. 이 메서드를 공부하면서 처음 작성한 코드와 결과를 비교해보았다.
.iterrows()
메서드 : pandas doc- pandas의 데이터 프레임에 대해, 행을 (인덱스, 시리즈) 쌍으로 반복하는 메서드이다
- index와 data가 필요하고, 각 행에 대해 series로 반환하기 때문에 행 간 데이터 타입은 유지되지 않는다.
- 만약 행 간 데이터 타입을 유지하고 싶다면
.itertuples()
를 사용해야 하고, 이쪽이 더 빠르다고 한다. - cf. (컬럼, 시리즈) 쌍을 반복하는 메서드는
.items()
각 컬럼을 list로 변환한 뒤 for문으로 결과를 출력
Python # 실제 매출 sales 계산하기 위하여, 반복문으로 처리 # for 반복문에서 사용할 데이터프레임의 각 컬럼을 리스트로 변환 rs = list(booking['reservation_status']) cancel = list(booking['is_canceled']) dp = list(booking['deposit_type']) adr = list(booking['adr']) days = list(booking['staying_nights']) # 결과를 출력할 빈 리스트 생성 result = [] # for 반복문 # 특정 조건을 만족할 경우에만 adr * days 로 매출액을 계산함 # 조건 외에는 0 출력 for i in range(0, len(rs)): if rs[i] == 'Check-Out': sales = adr[i] * days[i] elif (cancel[i] == 1) & (dp[i] == 'Non Refund'): sales = adr[i] * days[i] else: sales = 0 result.append(sales) print(result)
iterrows
메서드 사용하여 결과를 출력Python # Iterating using iterrows() : 튜터님이 알려주신 메서드를 방법! # 결과를 출력할 빈 리스트 생성 empty_list = [] # for 반복문 # 특정 조건을 만족할 경우에만 adr * days 로 매출액을 계산함 # 조건 외에는 0 출력 for index, row in booking.iterrows(): if row['reservation_status'] == 'Check-Out': a = row['adr'] * row['staying_nights'] elif (row['is_canceled'] == 1) & (row['deposit_type'] == 'Non Refund'): a = row['adr'] * row['staying_nights'] else: a = 0 empty_list.append(a) print(empty_list)
2번과 3번 결과 비교
Python # 두 함수의 결과 비교 # 소요 시간 : 0.1s vs 3.9s(iterrows가 더 느리다) s1 = pd.Series(result) s2 = pd.Series(empty_list) compare = pd.concat([s1, s2], axis= 1, ignore_index=False) column_names = ['list_forloop','method_iterrows'] compare.columns = column_names compare['Sub'] = compare[column_names[0]] - compare[column_names[1]] compare.describe()
고찰 & 기타
- SQL로 하면 더 쉬운 쿼리로 원하는 결과를 출력할 수 있을 텐데 하고 여러 번 SQL 염불을 외게 되는 하루였다....
- 그래도 나중에 한 번 더 복습해서 잘 활용만 한다면 파이썬으로 데이터 분석을 할 때 활용하기 좋은 메서드와 기능이다.
- pandas 공식 문서를 틈틈이 읽는 습관을 길러야겠다.
'내일배움캠프_데이터분석_2기 > TIL' 카테고리의 다른 글
[TIL] camp_day62_240712 (0) | 2024.07.15 |
---|---|
[TIL] camp_day61_240711 (0) | 2024.07.12 |
[TIL] camp_day56_240704 (0) | 2024.07.05 |
[TIL] camp_day54_240703 (0) | 2024.07.05 |
[TIL] camp_day52_240701 (0) | 2024.07.01 |