Tùy chọn low_memory không dùng nữa
Các low_memory
tùy chọn không phản đối đúng, nhưng nó phải được, vì nó không thực sự làm bất cứ điều gì khác nhau [ nguồn ]
Lý do bạn nhận được low_memory
cảnh báo này là bởi vì việc đoán các loại dtypes cho mỗi cột rất đòi hỏi bộ nhớ. Gấu trúc cố gắng xác định loại nào sẽ được đặt bằng cách phân tích dữ liệu trong mỗi cột.
Dtype Guessing (rất tệ)
Gấu trúc chỉ có thể xác định loại cột nào nên có khi toàn bộ tệp được đọc. Điều này có nghĩa là không có gì thực sự có thể được phân tích cú pháp trước khi toàn bộ tệp được đọc trừ khi bạn có nguy cơ phải thay đổi kiểu chữ của cột đó khi bạn đọc giá trị cuối cùng.
Hãy xem xét ví dụ về một tệp có một cột được gọi là user_id. Nó chứa 10 triệu hàng trong đó user_id luôn là số. Vì gấu trúc không thể biết nó chỉ là số, nên có thể nó sẽ giữ nó làm chuỗi gốc cho đến khi nó đọc được toàn bộ tệp.
Chỉ định dtypes (nên luôn luôn được thực hiện)
thêm
dtype={'user_id': int}
đến pd.read_csv()
cuộc gọi sẽ làm cho gấu trúc biết khi nào nó bắt đầu đọc các tập tin, rằng đây chỉ là số nguyên.
Cũng đáng chú ý là nếu dòng cuối cùng trong tệp sẽ "foobar"
được ghi trong user_id
cột, quá trình tải sẽ bị sập nếu dtype ở trên được chỉ định.
Ví dụ về dữ liệu bị hỏng khi vỡ được xác định
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 thường là một thứ numpy, đọc thêm về chúng ở đây:
http://docs.scipy.org/doc/numpy/reference/generated/numpy.dtype.html
Những gì dtypes tồn tại?
Chúng tôi có quyền truy cập vào các dtypes numpy: float, int, bool, timedelta64 [ns] và datetime64 [ns]. Lưu ý rằng các loại ngày / thời gian numpy không nhận biết múi giờ.
Gấu trúc mở rộng bộ dtypes này bằng chính nó:
'datetime64 [ns,]' Đó là dấu thời gian nhận biết múi giờ.
'category' về cơ bản là một enum (chuỗi được biểu thị bằng các phím số nguyên để lưu
'period []' Không bị nhầm lẫn với timedelta, các đối tượng này thực sự được neo vào các khoảng thời gian cụ thể
'Thưa thớt', 'thưa thớt [int]', 'thưa thớt [nổi]' dành cho dữ liệu thưa thớt hoặc 'Dữ liệu có nhiều lỗ hổng trong đó' Thay vì lưu NaN hoặc Không có trong khung dữ liệu, nó bỏ qua các đối tượng, tiết kiệm không gian .
'Interval' là một chủ đề của riêng nó nhưng công dụng chính của nó là để lập chỉ mục. Xem thêm tại đây
'Int8', 'Int16', 'Int32', 'Int64', 'UInt8', 'UInt16', 'UInt32', 'UInt64' đều là các số nguyên cụ thể của gấu trúc không thể tách rời, không giống như biến thể numpy.
'chuỗi' là một loại dtype cụ thể để làm việc với dữ liệu chuỗi và cấp quyền truy cập vào .str
thuộc tính trên chuỗi.
'boolean' giống như 'bool' numpy nhưng nó cũng hỗ trợ dữ liệu bị thiếu.
Đọc tài liệu tham khảo đầy đủ ở đây:
Pandas dtype tham khảo
Gotchas, hãy cẩn thận, ghi chú
Cài đặt dtype=object
sẽ tắt cảnh báo ở trên, nhưng sẽ không làm cho bộ nhớ hiệu quả hơn, chỉ xử lý hiệu quả nếu có bất cứ điều gì.
Cài đặt dtype=unicode
sẽ không làm bất cứ điều gì, kể từ khi numpy, a unicode
được biểu diễn dưới dạng object
.
Sử dụng bộ chuyển đổi
@sparrow chỉ ra chính xác việc sử dụng bộ chuyển đổi để tránh gấu trúc nổ tung khi gặp 'foobar'
trong một cột được chỉ định là int
. Tôi muốn thêm rằng các bộ chuyển đổi thực sự nặng và không hiệu quả để sử dụng trong gấu trúc và nên được sử dụng như là phương sách cuối cùng. Điều này là do quá trình read_csv là một quá trình duy nhất.
Các tệp CSV có thể được xử lý theo từng dòng và do đó có thể được xử lý song song bằng nhiều bộ chuyển đổi hiệu quả hơn bằng cách cắt tệp thành các phân đoạn và chạy nhiều quy trình, điều mà gấu trúc không hỗ trợ. Nhưng đây là một câu chuyện khác.