[전처리/과제] pandas 전처리 미니과제(3) - 그룹화 및 Aggregation | 문자열 처리 | 시간 데이터 처리 | 데이터 결합 | apply & map & lambda 활용

 

실습문제 파헤치기

🔍 customer_hm.csv

🚨 처음에 {LEFT : '탈퇴'}를 맵핑하니 적용이 안됨. 그래서 .unique()를 찍어 고유 값을 확인!! 역시나!! ➡️ LEFT CLUB이었네!
💡 위에 코드처럼 한 줄의 길이가 길어지면 가독성면에서 아쉬움. 그래서 맵핑부분을 변수로 넣어서 활용해보자!!

status_map = {'ACTIVE': '활동', 'PRE-CREATE': '사전생성', 'LEFT CLUB': '탈퇴'}
df['status_ko'] = df['club_member_status'].map(status_map)

🚨 처음 시도할 때 : lambda x: '10대' if x <20 else '20-30대' ...? 잉 여기서 어떻게 조건을 더 늘려야하지? 고민했음🤔!!
고민한 이유는 else와 '20-30대'가 한 묶음으로 생각했어서... 💡 위 코드처럼, if를 계속 적어주면 되지! 

🔍 함수를 적용한 풀이법도 있더군!! (튜터님 해설집)

def to_age_group(x):
    if x < 20: return '10대'
    if x < 40: return '20-30대'
    if x < 60: return '40-50대'
    return '60대+'
df['age_group'] = df['age'].apply(lambda x: to_age_group(x))
print(df['age_group'].value_counts())

🚨 질문했던 문제!  튜터님 왈: 결과가 잘못된 것 같은 때에는 연어처럼 위로 거슬러 올라가 하나씩 출력해볼 것!!
- approx_birth_year.astype(str)을 하지 않아서 결과가 이상하게 나왔었다...ㅎㅎ
- 문자열 + 문자열 연산이 가능하다!! (⬅️ 연도 문자열(str) + '-01-01'을 합친다!)

💡 튜터님 해설과 비교 해보자!  뭐가 이리 짧아?? 

birthdate_str = approx_birth_year.astype(str) + '-01-01'
# errors='coerce' : 형식에 맞지 않게 파싱되는 값들을 오류로 멈추지 않고 NaT(결측 시간)으로 바꾸라는 뜻
df['birthdate'] = pd.to_datetime(birthdate_str, errors='coerce')
print(df['birthdate'].dt.year.value_counts().sort_index().head())

🚨 내가 했던 실수? 기억을 거슬러...   ➡️  '2024-12-31'을 변수에 저장하지 않고 진행
# 해설 참고 내용 처럼 새로운 열로 저장하고 주변 컬럼과 같이 뽑아 비교해 볼 것!!!


🔍 2024.csv

🚨 흔히 아는 날짜형식이 아니라 '계약일'과 같이 되어 있을 땐, datetime 변환시 ➡️ format='%Y%m%d' 활용


🚨 궁금증! na=False 는 왜 넣어주는가?
- na=False → 결측은 False로 처리(= "빌라 아님") ➡️ 결과 시리즈가 깨끗한 bool 타입이 되어, .sum()이나 필터링이 수월!
- na=True → 결측을 True로 처리(보통 원하지 않음) ➡️ 이 경우는 결측도 '빌라'인 것으로 됨.
- 기본값(na 생략) → 결과에 NA가 그대로 남음


🚨 errors='coerce' : 형식에 맞지 않게 파싱되는 값들을 오류로 멈추지 않고 NaT(결측 시간)으로 바꾸라는 뜻 

끝.