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