카테고리 보관물: Python

Python

팬더 read_csv low_memory 및 dtype 옵션 /Users/josh/anaconda/envs/py27/lib/python2.7/site-packages/pandas/io/parsers.py:1130 : DtypeWarning :

전화 할 때

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문제에 도움이되는 이유는 무엇입니까?



답변

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


답변

시험:

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를 엉망으로 만들 필요가 없습니다. 도움이 되길 바랍니다. 문제가 더 있으면 알려주세요.


답변

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

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


답변

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})

답변

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


답변

거대한 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'] = ''

답변

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

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