팬더 read_csv low_memory 및 dtype 옵션


320

전화 할 때

df = pd.read_csv('somefile.csv')

나는 얻다:

/Users/josh/anaconda/envs/py27/lib/python2.7/site-packages/pandas/io/parsers.py:1130 : DtypeWarning : 열 (4,5,7,16)에는 혼합 유형이 있습니다. 가져올 때 dtype 옵션을 지정하거나 low_memory = False를 설정하십시오.

dtype옵션 이 왜 관련되어 low_memory있으며이 False문제에 도움이되는 이유는 무엇입니까?


2
이 경고에 대한 질문이 있습니다. 언급 된 열의 인덱스는 0을 기준으로합니까? 예를 들어, 혼합 유형을 갖는 열 4는 df [:, 4] 또는 df [:, 3]
maziar

CSV를 읽을 때 @maziar, 기본적으로 새로운 0 기반 인덱스가 생성되어 사용됩니다.
firelynx

답변:


431

더 이상 사용되지 않는 low_memory 옵션

low_memory옵션은 더 이상 사용되지 않지만 실제로 다르게 작동하지 않기 때문에 선택해야합니다. [ source ]

low_memory경고가 표시 되는 이유 는 각 열의 dtype을 추측하는 것이 메모리를 많이 요구하기 때문입니다. Pandas는 각 열의 데이터를 분석하여 설정할 dtype을 결정하려고합니다.

Dtype 추측 (매우 나쁨)

팬더는 전체 파일을 읽은 후에 만 ​​열에 어떤 dtype이 있어야하는지 결정할 수 있습니다. 즉, 마지막 값을 읽을 때 해당 열의 dtype을 변경해야 할 위험이 없다면 전체 파일을 읽기 전에 실제로 구문 분석 할 수있는 것은 없습니다.

user_id라는 열이있는 파일의 예를 고려하십시오. user_id가 항상 숫자 인 천만 개의 행이 있습니다. 팬더는 숫자 만 알 수 없으므로 전체 파일을 읽을 때까지 원래 문자열로 유지합니다.

dtypes 지정 (항상 수행해야 함)

첨가

dtype={'user_id': int}

받는 사람 pd.read_csv()이 파일을 읽기 시작할 때 호출이는 정수이다, 팬더가 알고 있어야합니다.

또한 파일의 마지막 행 "foobar"user_id열에 기록 되면 위의 dtype을 지정하면 로딩이 중단 된다는 점에 주목할 가치가 있습니다 .

dtypes가 정의 될 때 끊어진 데이터의 예

import pandas as pd
try:
    from StringIO import StringIO
except ImportError:
    from io import StringIO


csvdata = """user_id,username
1,Alice
3,Bob
foobar,Caesar"""
sio = StringIO(csvdata)
pd.read_csv(sio, dtype={"user_id": int, "username": "string"})

ValueError: invalid literal for long() with base 10: 'foobar'

dtypes는 일반적으로 numpy입니다. http://docs.scipy.org/doc/numpy/reference/generated/numpy.dtype.html

어떤 유형이 존재합니까?

float, int, bool, timedelta64 [ns] 및 datetime64 [ns]와 같은 numpy dtype에 액세스 할 수 있습니다. numpy 날짜 / 시간 dtype은 표준 시간대를 인식 하지 않습니다 .

팬더는이 dtype 세트를 자체적으로 확장합니다.

'datetime64 [ns,]'시간대 인식 타임 스탬프입니다.

본질적으로 열거 형인 '카테고리'(저장할 정수 키로 표시되는 문자열)

'period []'timedelta와 혼동하지 말고,이 객체들은 실제로 특정 기간에 고정

'Sparse', 'Sparse [int]', 'Sparse [float]'는 스파 스 데이터 또는 '구멍이 많은 데이터'를위한 것입니다. 데이터 프레임에 NaN 또는 None을 저장하는 대신 객체를 생략하여 공간을 절약합니다. .

'간격'은 자체 주제이지만 인덱싱에 주로 사용됩니다. 여기 더 참조

'Int8', 'Int16', 'Int32', 'Int64', 'UInt8', 'UInt16', 'UInt32', 'UInt64'는 numpy 변형과 달리 Null을 허용하는 팬더 특정 정수입니다.

'string'은 문자열 데이터 작업을위한 특정 dtype이며 .str계열 의 특성에 대한 액세스를 제공합니다 .

'boolean'은 numpy 'bool'과 같지만 누락 된 데이터도 지원합니다.

여기에서 완전한 참조를 읽으십시오 :

팬더 dtype 참조

잡티, 경고, 메모

설정 dtype=object하면 위의 경고가 사라지지만 메모리를 효율적으로 만들지 않고 처리하는 경우에만 효율적입니다.

dtype=unicode숫자는 a unicode로 표시 되기 때문에 설정 은 아무것도하지 않습니다 object.

변환기 사용

@sparrow는로 지정된 팬에서 팬더가 터지는 것을 방지하기 위해 변환기 사용법을 올바르게 지적 'foobar'합니다 int. 나는 변환기가 팬더에서 사용하기에 실제로 무겁고 비효율적이며 최후의 수단으로 사용해야한다고 덧붙이고 싶습니다. read_csv 프로세스는 단일 프로세스이기 때문입니다.

CSV 파일은 한 줄씩 처리 할 수 ​​있으므로 파일을 세그먼트로 자르고 팬더가 지원하지 않는 여러 프로세스를 실행하여 여러 변환기에서 병렬로 더 효율적으로 처리 할 수 ​​있습니다. 그러나 이것은 다른 이야기입니다.


6
따라서 a를 설정하는 dtype=object것이 메모리 효율성이 높지 않다면 오류를 제거하는 것 외에도 엉망이 될 이유가 있습니까?
zthomas.nc

6
@ zthomas.nc 예, Pandas는 열에있는 것을 테스트 할 필요가 없습니다. 로드하는 동안 메모리를 이론적으로 저장하지만 (로드가 완료된 후에는 없음) 이론적으로 일부 CPU 사이클을 저장합니다 (디스크 I / O로 인해 병목 현상이 발생하므로 알 수 없음)
firelynx

5
"또한 파일의 마지막 행에 user_id 열에"foobar "가 기록 된 경우, 위의 dtype을 지정하면 로딩이 중단됩니다." 충돌하는 대신이 행을 버리는 데 사용할 수있는 "강제"옵션이 있습니까?
참새

5
@ sparrow가있을 수 있지만 지난번에는 버그가있었습니다. 최신 버전의 팬더에서 수정되었을 수 있습니다. error_bad_lines=False, warn_bad_lines=True트릭을해야합니다. 설명서에는 C 파서에서만 유효하다고 말합니다. 또한 기본 파서는 없음으로 표시되어 어느 것이 기본값인지 알기가 어렵습니다.
firelynx

5
@nealmcb nrows=100인자로 데이터 프레임을 읽은 다음 df.dtypes얻을 수있는 dtype을 볼 수 있습니다. 그러나 이러한 dtype을 사용하여 전체 데이터 프레임을 읽을 때는 try/except잘못된 dtype 추측을 잡아야합니다. 데이터가 더럽습니다.
firelynx

50

시험:

dashboard_df = pd.read_csv(p_file, sep=',', error_bad_lines=False, index_col=False, dtype='unicode')

팬더 문서에 따르면 :

dtype : 유형 이름 또는 열의 dict-> type

low_memory 는 기본적으로 True 이며 아직 문서화되어 있지 않습니다. 그래도 관련성이 있다고 생각하지 않습니다. 오류 메시지는 일반적이므로 low_memory를 엉망으로 만들 필요가 없습니다. 도움이 되길 바랍니다. 문제가 더 있으면 알려주세요.


1
dtype=unicode제작 추가 : NameError: name 'unicode' is not defined. 그러나 unicode따옴표 ( 'unicode'에서와 같이)를 넣으면 작동하는 것처럼 보입니다!
sedeh

5
@sedeh dtypes를 python 유형 또는으로 지정할 수 있습니다 numpy.dtype('unicode'). dtype 옵션에 문자열을 제공하면 numpy.dtype()기본적으로 팩토리를 통해 전송하려고 시도합니다 . 지정 'unicode'하면 실제로 아무것도하지 않고 유니 코드는로 업 캐스트됩니다 objects. 당신은 얻을 것이다dtype='object'
firelynx

43
df = pd.read_csv('somefile.csv', low_memory=False)

문제가 해결 될 것입니다. CSV에서 1.8M 행을 읽을 때 정확히 같은 오류가 발생했습니다.


51
이렇게하면 오류가 발생하지 않지만 실제로 다른 내용은 변경되지 않습니다.
firelynx

2
1.5gb 데이터 파일을 실행하는 동안 동일한 문제가 있습니다
Sitz Blogz

18

dtype이 명시 적으로 지정되고 해당 dtype과 호환되지 않는 혼합 된 데이터가있는 경우 firelynx가 앞에서 언급 한 것처럼로드가 중단됩니다. 데이터를 여전히로드 할 수 있도록 호환되지 않는 데이터 형식으로 값을 변경하는 해결 방법으로 이와 같은 변환기를 사용했습니다.

def conv(val):
    if not val:
        return 0    
    try:
        return np.float64(val)
    except:        
        return np.float64(0)

df = pd.read_csv(csv_file,converters={'COL_A':conv,'COL_B':conv})

2

~ 400MB 파일과 비슷한 문제가있었습니다. 설정 low_memory=False은 나를 위해 트릭을했다. 간단한 작업을 먼저 수행하십시오. 데이터 프레임이 시스템 메모리보다 크지 않은지 확인한 다음 재부팅하고 RAM을 지우고 계속하십시오. 여전히 오류가 발생하면 .csv파일이 정상인지 확인하고 Excel에서 빠르게 살펴보고 명백한 손상이 없는지 확인하십시오. 손상된 원본 데이터는 혼란을 초래할 수 있습니다 ...


1

거대한 CSV 파일 (6 백만 행)을 처리 할 때 비슷한 문제에 직면했습니다. 세 가지 문제가 있습니다 : 1. 파일에 이상한 문자가 포함되어 있습니다 (인코딩을 사용하여 수정 됨) 2. 데이터 유형이 지정되지 않았습니다 (dtype 속성을 사용하여 수정 됨). 3. 위를 사용하여 여전히 file_format과 관련된 문제가 발생했습니다 파일 이름을 기준으로 정의 됨 (try .. except ..를 사용하여 수정 됨)

df = pd.read_csv(csv_file,sep=';', encoding = 'ISO-8859-1',
                 names=['permission','owner_name','group_name','size','ctime','mtime','atime','filename','full_filename'],
                 dtype={'permission':str,'owner_name':str,'group_name':str,'size':str,'ctime':object,'mtime':object,'atime':object,'filename':str,'full_filename':str,'first_date':object,'last_date':object})

try:
    df['file_format'] = [Path(f).suffix[1:] for f in df.filename.tolist()]
except:
    df['file_format'] = ''

-1

low_memory = FalseDataFrame을 가져 오는 동안 나에게 도움이되었습니다. 그것이 나를 위해 일한 모든 변화입니다.

df = pd.read_csv('export4_16.csv',low_memory=False)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.