페이지 불러오는 중
데이터를 로드한 직후에는 모양(shape) → 형(info) → 분포(describe, value_counts) → 결측(isna().sum()) → 메모리(memory_usage) 순으로 점검합니다.
이 5분짜리 점검만 해도 이후 정제 단계에서 "이 열이 왜 object지?", "왜 행이 이렇게 많지?" 같은 혼란을 크게 줄일 수 있습니다.
import pandas as pddf.shape # (10432, 12) - (행, 열)
df.head(5) # 앞 5행
df.tail(5) # 뒤 5행 (정렬·적재 순서 확인)
df.sample(5, random_state=0) # 무작위 5행 (앞뒤 편향 없이 실제 값 감각)
df.columns.tolist() # 열 이름 목록💡 이럴 때:
head만 보면 정렬된 앞부분만 보게 됩니다.sample까지 함께 봐야 중간에 섞인 이상한 값을 발견할 수 있습니다.
info()df.info(memory_usage="deep")
# <class 'pandas.core.frame.DataFrame'>
# RangeIndex: 10432 entries, 0 to 10431
# Data columns (total 12 columns):
# # Column Non-Null Count Dtype
# --- ------ -------------- -----
# 0 order_date 10432 non-null datetime64[ns]
# 1 user_id 10120 non-null Int64 ← 312개 결측
# 2 category 10432 non-null category
# 3 amount 10432 non-null float64
# ...object, 날짜인데 object) 이 단계에서 바로 잡습니다.memory_usage="deep"는 object 열의 실제 문자열 크기까지 계산합니다.describe()df.describe()
# amount qty
# count 10432.000000 10432.0
# mean 153.240000 2.4
# std 412.010000 1.9
# min -5.000000 0.0 ← 음수 금액? 이상치 의심
# 25% 30.000000 1.0
# 50% 80.000000 2.0
# 75% 160.000000 3.0
# max 25000.000000 40.0 ← max가 mean의 100배 → 꼬리 두꺼움
df.describe(include="object") # 문자열 열: count, unique, top, freq
df.describe(include="all") # 전체💡 이럴 때:
min이 음수/0인데 그럴 수 없는 값(나이, 금액, 수량)이라면 데이터 오류를 의심해야 합니다.max가75%보다 훨씬 크면 이상치가 있거나 로그 스케일이 필요한 분포일 수 있습니다.
value_counts, unique, nuniquedf["category"].value_counts()
df["category"].value_counts(normalize=True) # 비율
df["category"].value_counts(dropna=False) # 결측도 한 범주로 표시
df["category"].nunique() # 고유값 개수
df["category"].unique() # 고유값 배열
pd.crosstab(df["category"], df["is_member"]) # 두 범주 교차표💡 이럴 때:
value_counts(dropna=False)로 결측 비율을 확인합니다.nunique()가 행 수와 비슷하면 식별자(ID) 열일 가능성이 크고, 아주 작으면 범주형 후보입니다.
💡 이럴 때: "Seoul", "seoul", "서울 "처럼 표기가 흔들리면 value_counts에서 별개 항목으로 드러납니다 → Python - pandas 06. 정제와 변환의 .str 정규화 대상.
df.isna().sum() # 열별 결측 개수
df.isna().mean().sort_values(ascending=False) # 열별 결측 비율
df.isna().sum(axis=1).value_counts() # 행별 결측 개수 분포
df[df.isna().any(axis=1)] # 결측이 하나라도 있는 행df.memory_usage(deep=True) # 열별 바이트
df.memory_usage(deep=True).sum() / 1e6 # 전체 MB
# 절감 여지 확인
df.select_dtypes("object").nunique() # object 열의 카디널리티 → category 후보💡 이럴 때: 메모리가 빠듯하면
object열 중nunique가 작은 것은category로, 큰 정수/실수 열은downcast로 줄입니다
댓글
GitHub 계정으로 의견이나 질문을 남길 수 있습니다.