[판다스] csv불러올 때 DtypeWarning 해결방법

반응형
    반응형

    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 오류를 해결할 수 있습니다. 데이터의 특성에 따라 어떤 방법이 가장 적합한지 참고하시기 바랍니다.

    댓글

    Designed by JB FACTORY

    ....