Watch at Ease세상을 읽고, 일상의 답을 찾다.

기술 · 실용 가이드

pandas CSV 식별자가 문자열형인데도 바뀌나요? 가져오기 전후 값을 추적하세요

네 행 대조 실험으로 숫자 추론, 결측값 규칙, CSV에 이미 기록된 손실을 구분했습니다. 나중의 문자열 변환으로 모두 복구되지는 않습니다.

원본 일러스트: C 파서에서 숫자 추론, 기본 NA 정책을 쓰는 string형, 텍스트 보존을 명시한 결측 정책의 실측 비교.
원본 일러스트: C 파서에서 숫자 추론, 기본 NA 정책을 쓰는 string형, 텍스트 보존을 명시한 결측 정책의 실측 비교. Watch at Ease

CSV 식별자가 바뀌면 형 변환을 더하기 전에 원본 필드와 각 처리 단계의 값을 비교하세요. 문자열 dtype은 결측값 인식을 자동으로 끄지 않으며, 이미 손상된 내보내기 파일을 문자열로 읽어도 앞선 숫자 변환에서 사라진 자릿수를 되살릴 수 없습니다.

Python 3.12.14, pandas 2.2.3, C 파서로 00123, 9007199254740993, 문자 그대로의 NA, 빈 필드라는 네 식별자를 시험해 13개 점검을 통과했습니다. NA를 텍스트로 정의한 작은 대조 예시이며 실제 애플리케이션의 결측값 규칙은 따로 결정해야 합니다.

원본 필드와 알려진 스키마부터 확인하기

원본 CSV를 보관하고 인코딩, 구분자, 인용 규칙, 헤더, 식별자 열을 기록합니다. 실제 방언에 맞춰 작업 사본을 파싱하세요. Python의 csv.reader는 보통 숫자로 자동 변환하지 않고 문자열을 반환합니다. 텍스트 기준을 만들 때 QUOTE_NONNUMERIC를 쓰지 말고 사전으로 필드를 매핑하기 전에 헤더 위치를 확인하세요.

서식 표시만 보지 말고 정확한 표본 값을 기록합니다. CSV 인용부호는 필드를 구분하며 pandas의 형 선언이 아닙니다. 연결된 Excel 가이드는 같은 원본 경계를, 헤더 가이드는 중복 라벨을 별도로 다룹니다. 파일 해시는 바이트 식별을 기록하지만 로컬 해시 하나로 올바른 업무 값을 확정할 수는 없습니다.

문자열형과 결측값 정책을 따로 정하기

import pandas as pd 뒤에 시험한 호출은 pd.read_csv('input.csv', engine='c', dtype={'id': 'string'}, keep_default_na=False)입니다. 알려진 UTF-8 표본에서 00123, 정확한 큰 식별자, 문자 NA, 빈 문자열을 보존했습니다. string만 지정하면 숫자는 남아도 뒤의 두 값은 결측이 됐습니다.

keep_default_na=False는 id뿐 아니라 해당 읽기 전체의 결측 토큰 인식에 영향을 줍니다. 여기서는 원래 텍스트를 확인하기 위한 것이며 모든 열의 빈칸을 유효하게 선언하는 설정은 아닙니다. 제공자의 스키마에 따라 열별 결측 토큰과 형을 정하고 검증하세요. 오류를 없애려고 결측을 0이나 문자 'nan'으로 임의 치환해서는 안 됩니다.

현재 읽기 이전에 손실됐는지 찾기

63바이트 입력의 모든 필드는 인용부호로 둘러쌌습니다. 기본 읽기는 식별자를 float64로 추론했고 이후 string 변환은 123.0과 9007199254740992.0을 만들었습니다. 이를 내보내면 바뀐 숫자가 새 CSV에 기록됐고 문자 NA와 원래 빈 필드는 모두 빈 필드가 됐습니다.

이 손상된 CSV를 명시적인 문자열 설정으로 다시 읽어도 손상된 텍스트만 보존됩니다. 현재 파서가 최초 손실 지점이 아니기 때문입니다. 이 파일과 정확히 보존한 내보내기 파일은 우연히 모두 43바이트에 행·열 수도 같았습니다. 이 대조 실험에서 크기와 형태의 일치는 값의 일치가 아니었습니다.

별도 왕복 파일을 원본 값과 비교하기

새 경로에 기록하고 같은 선언된 스키마로 다시 파싱합니다. 순서가 있는 식별자 문자열과 결측 구분을 원본과 비교하고 레코드 수, 충돌, 값의 변화를 조사하세요. 보존 경로는 네 값을 모두 유지했지만 인용 형태가 바뀌어 63바이트에서 43바이트가 됐습니다. 원시 바이트의 완전 일치는 적절한 의미상 완료 기준이 아니었습니다.

가장 오래된 가용 CSV에 이미 반올림되거나 짧아진 식별자가 있다면 신뢰할 수 있는 제공자가 다시 내보낸 파일이나 더 이른 보관 원본으로 돌아가세요. 0 채우기나 표시된 실수의 재반올림으로 잃은 식별자를 확정할 수는 없습니다. 이번 측정은 pandas 2.2.3 C 엔진과 합성 네 행에 한정되므로 다른 환경에서는 실제 버전과 파서를 재확인하세요.

원본 일러스트: 직접 만든 43바이트 CSV 내보내기 두 개는 레코드·열 수가 같아도 숫자 추론 뒤 식별자 값이 다르다.
원본 일러스트: 직접 만든 43바이트 CSV 내보내기 두 개는 레코드·열 수가 같아도 숫자 추론 뒤 식별자 값이 다르다. Watch at Ease