groupby / pivot / merge / map


store_summary = df.groupby("store").agg(
total_orders=("sales", "sum"),
orders=("order_id", "count"),
paid_rate=("paid", "mean"),
).reset_index()
groupby("store") : store 값이 같은 것끼리 묶어서 계산하자 ; 매장별 계산→ 광교점/수원점 두 덩어리로 데이터가 쪼개짐


.agg() : 각 그룹에 대해 여러 계산을 한 번에 실행count는 결측치가 아닌 값의 개수를 셈
order_id가 있는 행의 개수가 3개(O001, O002, O003)order_id가 있는 행의 개수가 2개(O004, O005)파이썬/판다스에서 True/False는 각각 1, 0으로도 취급
mean()은 여기서 '결제 비율'을 구한다고 볼 수 있다.
.rest_index()
groupby 때문에 index화 된 컬럼을 다시 정상 컬럼 자리로 되돌림
pivot_sales = ym_day.pivot(index="ym", columns="day_name", values="total_sales").fillna(0)
pivot_sales
ym이 행 인덱스, day_name이 열 컬럼으로 들어가고, 그 교차 지점에 total_sales 값이 채워진 표



각 메뉴 이름에 어떤 카테고리를 붙일지 정리한 표 생성


df에 menu_map을 합친 형태의 df2를 생성
on="menu" : 메뉴 이름을 기준으로
.merge() : 두 테이블 병합
how="left": 원래 df 행은 그대로 유지. menu_map에 매칭되는 카테고리가 있으면 붙이고 없으면 NaN 값으로 남겨두기
df2[["menu","category"]].drop_duplicates() : menu와 category열만 선택해서 중복 제거

메뉴만 있고 카테고리 정보가 없음

메뉴마다 해당하는 카테고리 정보가 새로 붙음

channel_map = {"kiosk":"키오스크", "app":"앱"}channel_map이라는 딕셔너리 생성df2["channel_kr"] = df2["channel"].map(channel_map).fillna("기타")df2["channel"] df2 데이터프레임에서 channel 컬럼 가져와서.map(channel_map) 컬럼 내 각 값을 channel_map 딕셔너리에 맞게 매핑(치환).fillna("기타") 만약 channel컬럼에 channel_map에서 명시하지 않은 값이 있다면 그 자리는 "기타"로 채워넣기df2[["channel","channel_kr"]].drop_duplicates()중복을 제거한 뒤 어떤 채널이 어떤 한글 값으로 매핑되었는지 확인

.sort_values() 메서드는 특정 열을 기준으로 정렬ascending 매개변수는 오름차순 여부 지정ascending=False는 내림차순 정렬