[판다스] csv불러올 때 DtypeWarning 해결방법
- Python/오류
- 2023. 10. 28.
DtypeWarning
잘 불러오던 csv가 간혹 DtypeWarning 이라고 경고가 뜹니다.
DtypeWarning: Columns (37,66) have mixed types. Specify dtype option on import or set low_memory=False.
특정 컬럼의 type이 섞여있어서 결정할 수 없다고 합니다. 그럼 다 object로 하지 않았나? 왜저러는걸까? 싶은데 컴퓨터가 인식을 그렇게한다니까 어떻게 할 수 있는 건 아닌 것 같습니다.
저 경고를 무시하고 코딩실행을 하니깐 확실히 작업속도가 현저히 느려졌습니다. 메모리 도둑이 따로없네요.
해결방법
해결방법은 두가지입니다.
(1) 문제가 되는 컬럼의 타입을 정해준다
(2) csv에 쓰는 메모리 제한을 없애서 csv를 한번에 읽을 수 있도록 합니다.
(3) 컬럼을 제외시킵니다.
문제가 되는 컬럼 타입 정하기
이 방법의 문제는 컬럼을 인덱스로 알려주기 때문에 내가 그 컬럼이름을 알아야 한다는 것입니다(인덱스로 하니 적용이 안됩디다...) DtypeWarning이 뜨긴 했지만 코딩은 되니 컬럼 이름을 확인합니다.
df.columns[37]
모두 확인했으면 dtype 파라미터를 이용해 타입을 결정합니다.
df =pd.read_csv('filename.csv',dtype={'배송비결제방식':str,'URL':str})
메모리 제한 해제
low_memory
옵션을 False
로 설정하여 Pandas에게 파일을 한 번에 읽도록 합니다. 이 경우 메모리가 충분한 경우에 하는 걸 추천드립니다. 다음과 같이 설정할 수 있습니다:
df = pd.read_csv(f'{file_name}.csv', low_memory=False)
이렇게 하면 Pandas가 파일을 한 번에 읽어오기 때문에DtypeWarning은 발생하지 않을 것입니다. 다만, 메모리 사용량에 주의해야 합니다.
해당 컬럼 제외
만약 DtypeWarning이 발생하는 열에 대한 데이터가 필요하지 않다면, 해당 열을 무시하고 다른 열만을 읽을 수 있습니다. usecols
옵션을 사용하여 필요한 열만 지정할 수 있습니다.
먼저 csv의 컬럼의 갯수를 안다는 전제하에 리스트에서 문제가 되는 컬럼을 빼겠습니다.
except_list =[i for i in range(1,70) if i not in (37,66)]
그 후 usecols에 넣습니다.
df = pd.read_csv(f'{file_name}.csv', usecols=except_list)
이러면 문제가 되는 컬럼은 제외되서 DtypWarning 경고가 발생하지 않습니다.
마치며
위의 방법 중 하나를 사용하여 DtypeWarning
오류를 해결할 수 있습니다. 데이터의 특성에 따라 어떤 방법이 가장 적합한지 참고하시기 바랍니다.
'Python > 오류' 카테고리의 다른 글
[파이썬] try except으로 에러라인 출력하기 (0) | 2024.08.19 |
---|---|
Solving environment: failed with initial frozen solve. Retrying with flexible solve 해결 (0) | 2022.10.01 |
정규표현식 TypeError : expected string or bytes-like object (0) | 2022.02.14 |
Value Error If using all scalar values, you must pass an index 해결방법 (0) | 2022.01.08 |
파이썬 ClobberError 마구 뜰때 해결방법 (0) | 2021.11.24 |