CSV의 고객 번호 0012가 12로 바뀌거나 지역 코드 NA가 결측값이 됐다면, 읽기 단계의 자동 추론부터 확인해야 합니다. 식별자 열은 문자열 자료형으로 지정하고, 결측 표시는 데이터의 의미에 맞게 별도로 정하는 것이 핵심입니다.
빅데이터 분석 실습에서도 입력값이 달라지면 이후 정렬·집계·결합 결과가 달라질 수 있습니다. 아래 예제는 파일 없이 그대로 실행할 수 있으며 pandas 2.2.3에서 결과를 확인했습니다.

1. 기본 설정에서 무엇이 바뀌는지 재현하기
from io import StringIO
import pandas as pd
csv = """customer_id,region,amount
0012,NA,100
0034,EU,
0056,,250
"""
df = pd.read_csv(StringIO(csv))
print(df["customer_id"].tolist())
print(df["region"].isna().tolist())
[12, 34, 56]
[True, False, True]
고객 번호는 숫자로 해석되어 앞의 0이 사라졌습니다. NA는 기본 결측 표시에 포함되어 빈 지역 값과 함께 결측으로 읽혔습니다. 실제 데이터에서 NA가 지역명이나 업무 코드라면 이 해석은 잘못된 것입니다.
2. 앞자리 0은 읽을 때 보존하기
고객 번호·우편번호·상품 코드는 계산할 숫자가 아니라 식별자일 수 있습니다. 해당 열에 dtype={"customer_id": "string"}을 주면 문자열로 읽습니다. 반면 금액처럼 계산할 열까지 모두 문자열로 바꾸면 집계 전에 추가 변환이 필요해집니다.

이미 숫자로 읽은 뒤 astype(str)을 적용해도 12가 0012로 돌아오지는 않습니다. 원래 길이를 알고 있을 때만 str.zfill(4) 같은 보정이 가능하며, 길이가 제각각인 식별자는 원본 CSV를 다시 읽는 편이 안전합니다.
3. 문자열 NA는 유지하고 빈 값만 결측 처리하기
dtype만 지정해도 기본 결측 판정은 계속 적용됩니다. 아래에서는 기본 결측 목록을 끄고, 지역과 금액의 빈 문자열만 결측으로 지정합니다.
df = pd.read_csv(
StringIO(csv),
dtype={
"customer_id": "string",
"region": "string",
"amount": "Float64",
},
keep_default_na=False,
na_values={
"region": [""],
"amount": [""],
},
)
print(df["customer_id"].tolist())
print(df["region"].fillna("[missing]").tolist())
print(df.isna().sum().to_dict())
['0012', '0034', '0056']
['NA', 'EU', '[missing]']
{'customer_id': 0, 'region': 1, 'amount': 1}
Float64는 결측값을 담을 수 있는 pandas의 nullable 실수 자료형입니다. 지역의 NA는 문자열로 남고, 실제 빈 값은 결측이 됩니다. fillna("[missing]")는 출력 확인용으로 사용했으며 원래 열을 덮어쓰지 않습니다.

keep_default_na=False를 사용하면 기본 목록 전체가 비활성화됩니다. 따라서 금액에 NULL이나 N/A도 들어온다면 그 열의 na_values에 실제로 허용할 표식을 추가해야 합니다. 공백 한 칸도 빈 문자열과 다르므로 파일의 규칙을 확인하세요.
4. 옵션을 고르기 전에 확인할 기준
- 식별자를 보존하려면: 해당 열의 dtype를 문자열로 지정합니다.
- NA 같은 문자를 실제 값으로 쓰려면: 기본 결측 판정을 끄고 필요한 표식만 na_values로 정합니다.
- 결측을 전혀 해석하지 않으려면: na_filter=False를 검토할 수 있지만, 이때 keep_default_na와 na_values는 적용되지 않습니다.
- 숫자 열에 빈 값이 있다면: 빈 값을 명시적으로 결측 처리하고 적합한 nullable 자료형을 선택합니다.
특정 열에 converters를 지정하면 그 열은 dtype 변환 대신 converter로 처리됩니다. 두 옵션을 동시에 써도 둘 다 차례대로 적용된다고 가정하면 안 됩니다. 예제는 기본 CSV 파서를 사용하며 다른 엔진을 쓰면 옵션 지원 여부도 확인해야 합니다.
5. 읽기 직후 짧게 검증하기
print(df.dtypes)
print(df.isna().sum())
assert df["customer_id"].tolist() == ["0012", "0034", "0056"]
assert df.loc[0, "region"] == "NA"
assert pd.isna(df.loc[2, "region"])

실제 파일에서는 대표 식별자 몇 개, 빈 값이 있는 행, 문자열 NA가 있는 행을 골라 원본과 비교하면 됩니다. 파일의 결측 규칙이 바뀌면 같은 검증을 다시 수행하세요. 인코딩 문제와 앞자리 0 손실은 원인이 다르므로 각각 확인해야 합니다.
핵심 정리: 문자열 자료형 지정은 식별자의 모양을 보존하고, 결측 옵션은 값의 의미를 결정합니다. 두 설정을 함께 정한 뒤 원본 표본과 대조해야 분석의 출발점을 지킬 수 있습니다.
이론과 실습을 연결하려면 빅데이터분석기사 필기 핵심 개념 모음에서 전처리 관련 개념도 함께 확인해 보세요.
'자격증 > 빅데이터 분석 기사' 카테고리의 다른 글
| pandas 날짜 변환 오류 찾기: to_datetime·NaT와 원본값 검사 (0) | 2026.10.06 |
|---|---|
| pandas groupby에서 행이 사라질 때: dropna=False와 size·count 구분 (0) | 2026.10.04 |
| 빅데이터분석기사 분산 계산 실습: NumPy와 pandas의 ddof 맞추기 (1) | 2026.10.02 |
| 빅데이터분석기사 전처리 누수 실습: 평균 대체와 Pipeline 적용 순서 (0) | 2026.10.01 |
| 빅데이터분석기사 필기 혼동행렬 계산 실습: 정밀도·재현율·F1과 지표 선택 (0) | 2026.09.29 |
댓글