[전처리/과제] pandas 전처리(2) - 조건 필터링 | 데이터 정렬&정제 | 결측치&중복값 처리

🎯 이제 조건 필터링은 재밌게 해볼 수 있을 것 같다!  아니야... 아직 먼 것 같다...
결측치를 처리할 때 열 삭제 / 행 삭제가 아직 조금은 헷깔리는(🤔) 듯 하다...
신기한 단축키를 배웠다!!! ➡️ alt(option) +shift + 아래 방향키 : 해당줄 아래복사
😌 과제 후 회고 및 느낀점

이번 전처리 세션과 미니과제를 통해 배운 것 그리고 방법들을 다음 프로젝트에 반드시 적용해야겠다
는 생각이 들었다. 지난 번 프로젝트 때 아쉬운 점들이 많아서 그런지 그 욕구가 더 커지는 듯 하다.
아쉬운 점을 두 가지만 나열해 보자면 다음과 같다.
1️⃣ customer | transactions | articles 3개의 파일에서 결측치, 중복값을 처리하고 저장한 새로운 파일로 진행했던 점
2️⃣ 전처리 과정을 명시적으로 드라나게 진행하지 않은 점. 예: print("중복 제거 후 행 수:" len(dropped_dup)) 처럼

실습파일로 전처리 파헤치기

🔍 customer_hm.csv 파일

[조건필터링/행 개수 출력] 갑자기 헷깔려버리기!! 🤪 
 40세 이상 고객 필터링까지는 어찌했는데, 첫5행과 행 수 출력에서 혼동

🚨 해설
elder_40 = df[df['age'] >= 40]

print(elder_40.head())
print("행 개수:", len(elder_40))  # 행 개수 len(..) 사용

[정렬] .sort_values() 까진 알았지만, ( ) 안에 들어가는 파라미터를 까먹음! (columns='age')를 사용했음...ㅠㅠ
➡️ .sort_values(by='age', ascending=False)
나이(age) 기준 내림차순으로 정렬하여 상위 5명 출력

🚨 풀이
mask = df.sort_values(by='age', ascending=False)
mask.head()

🔍 다중 정렬: by=['열1', '열2'], ascending=[True, False]

[열 제거]
잘못 제거해버리는 바람에, csv파일 다시 불러왔지..ㅎㅎ삭제는 조심조심!
분석에 불필요하다고 가정하고 FN 열을 제거한 새로운 데이터프레임을 만들어 컬럼 목록 출력

# 열 삭제: .drop(columns=' ') vs [구분] 결측치 있는 열 삭제: .dropna(axis=1)
# ➡️ 전자에 결측치 컬럼을 모두 적어준다면,, 결과는 같음. 
dropped_fn = df.drop(columns='FN')

# 컬럼 목록
dropped_fn.columns
🚨 해설
df_no_fn = df.drop(columns=['FN'])
print("열 제거 후 컬럼:", df_no_fn.columns.tolist()[:10])  ⬅️ [:10]은 왜??

[열 이름 변경]
df.rename=(columns={'기존1':'대체2', '기존2':'대체2'}  여러개도 가능!

# 컬럼명 변경!
df_cleaned = df.rename(columns={'age':'나이', 'Active':'활성'})

# 컬럼 목록 확인!
df_cleaned.columns

🔍 2024.csv 파일

고객 파일보단 부동산 파일이 재밌는 것 같다..ㅎㅎ 한글이 있어서 그런가?? 무튼! 그렇다.

import pandas as pd

df= pd.read_csv("2024.csv", encoding="cp949")
df.head()
우선, 판다스 불러와주고 csv 파일 불러와주고 여기서 한글 안깨지게 인코딩 해주고 5행만 불러와주고!

조건을 만족하는 특정 행들을 불러올 것이 아니라면!! ➡️ 위 처럼 df['조건 필터링'] 하고 변수에 저장!!
✅ 행의 개수를 확인하고 싶다면!! ➡️ len(df) 또는 df.shape[0]
[🔍 비교]
mask = (df['자치구명'] == '강남구') & (df['건물용도'] == '오피스텔')
df.loc[mask, ['자치구명', '건물용도', '물건금액(만원)]]

이건 그냥 참고 및 기억용으로 기록!
🔍 .isnull() 결과를 뽑으면, 불린 시리즈로 불러와짐!! ➡️ 따라서 결측 조건 필터링인 샘이다.

정렬을 하고 제대로 됐는지 확인하고 싶을 땐, 정렬 후 바로 df.head() 하지 말고 ❌
➡️ 정렬한 컬럼과 원하는 컬럼을 몇개 지정해서 뽑아보자. 다중 정렬도 마찬가지! ✅ 아래 풀이 처럼.
sort_df = df.sort_values(by='물건금액(만원)', ascending=False)
print(sort_df[['자치구명', '법정동명', '물건금액(만원)']].head()​

열 제거 실수를 거듭하여 이번에는 실수하지 않음 😏. 위에서 '권리구분' 열을 삭제하고 아래에서 결과를 확인해 볼 수 있다.
💡 열 제거: .drop(columns='열')     💡 열 이름 변경: .rename(columns={'기존명' : '대체명', ' ' : ' '}
✅ 모두 파라미터로 columns= 를 사용한다!!
어느정도 잘 풀어낸 것 같다. but, 원본 자체를 변경할 때는 .copy()를 해두자!!
# 🚨 해설
median_year = df['건축년도'].median()
df_year_filled = df.copy()
df_year_filled['건축년도'] = df_year_filled['건축년도'].fillna(median_year)
print("채운 후 건축년도 결측치:", df_year_filled['건축년도'].isnull().sum())​

특정 컬럼 기준으로 중복 개수 확인 ➡️ 중복 제거 ➡️ 제거 전/후 행 수 비교
💡 df.duplicated(subset=[' ']) & df.drop_duplicates(subset=[' ']) ✅ 중복확인&제거의 파라미터는 subset=[' ']

끝.