Python 강좌 / pandas로 표 데이터 정리하고 분석하기
pandas는 행과 열로 이루어진 데이터를 DataFrame으로 다루는 라이브러리입니다. 읽기·검증·집계·저장을 나누고 결측값과 잘못된 숫자를 어떻게 처리했는지 함께 기록해야 결과를 해석할 수 있습니다.
DataFrame과 열의 자료형
DataFrame은 표, Series는 한 열에 대응하는 구조입니다. CSV를 읽을 때 추론된 자료형이 업무 규칙과 다를 수 있습니다. ID의 앞자리 0을 보존하려면 처음부터 문자열로 읽고 숫자 열만 명시적으로 변환합니다.
관련 동작과 지원 조건은 pandas로 표 데이터 정리하고 분석하기 관련 공식 문서에서 확인할 수 있습니다.
가상환경에서 아래 명령으로 설치합니다. pandas는 표준 라이브러리가 아니며 Python과 운영체제에 맞는 버전을 선택해야 합니다.
python -m pip install pandas
전체 예제와 실행 결과
별도의 실습 폴더에서 아래 파일을 UTF-8로 저장합니다. 가상환경을 선택한 터미널에서 python pandas_demo.py 명령으로 실행합니다. macOS·Ubuntu에서 가상환경을 사용하지 않는 경우 명령 이름을 python3으로 바꿉니다.
pandas_demo.py 파일의 전체 내용입니다.
from io import StringIO
import pandas as pd
raw = "id,category,amount\ne1,food,3500\ne2,food,8000\ne3,transport,2500\ne4,food,bad\n"
df = pd.read_csv(StringIO(raw), dtype="string", keep_default_na=False)
amounts = pd.to_numeric(df["amount"], errors="coerce")
valid = amounts.notna() & (amounts >= 0) & (amounts % 1 == 0)
clean = df.loc[valid].copy()
clean["amount"] = amounts.loc[valid].astype("int64")
report = clean.groupby("category", as_index=False, sort=True)["amount"].sum()
print("accepted:", len(clean), "rejected:", int((~valid).sum()))
for row in report.itertuples(index=False):
print(row.category, row.amount)
예상 결과는 다음과 같습니다.
accepted: 3 rejected: 1 food 11500 transport 2500
결측 처리와 복사 범위
errors="coerce"는 변환 실패를 결측값으로 표시합니다. 실패한 행을 없던 것으로 처리하는 것이 아니라 valid 마스크와 제외 수를 확인해야 합니다. 원본을 보존하면서 새 열을 대입하려고 loc 선택 뒤 copy를 사용했습니다.
예제는 금액이 int64 범위에 들어가는 작은 데이터라는 전제입니다. 매우 큰 정수나 정확한 십진 금액은 숫자 변환 과정과 자료형 범위를 따로 검토합니다. 문자열 ID의 결측·공백·중복 검증도 실제 데이터 조건에 맞춰 추가해야 합니다.
저장과 결과 검증
report.to_csv("category-report.csv", index=False, encoding="utf-8")
이 줄은 report를 만든 뒤 파일 끝에 추가합니다. 기존 파일을 덮어쓰므로 새 출력 경로를 사용합니다. index=False를 빼면 DataFrame 인덱스가 열로 추가될 수 있습니다. 원본 유효 행의 총액과 보고서 총액이 14000으로 같은지 비교하세요.
bad를 0과 -1로 각각 바꾸어 수용·제외 기준을 확인합니다. groupby의 결과만 보지 말고 수용·제외 수와 원본 행 수가 맞는지 함께 확인해야 데이터 손실을 찾기 쉽습니다.




