Opsi low_memory usang
The low_memory
opsi tidak benar usang, tetapi harus, karena tidak benar-benar melakukan hal berbeda [ sumber ]
Alasan Anda mendapatkan low_memory
peringatan ini adalah karena menebak dtip untuk setiap kolom sangat menuntut memori. Panda mencoba menentukan tipe apa yang akan ditetapkan dengan menganalisis data di setiap kolom.
Dtype Guessing (sangat buruk)
Panda hanya dapat menentukan tipe kolom apa yang seharusnya dimiliki setelah seluruh file dibaca. Ini berarti tidak ada yang benar-benar dapat diuraikan sebelum seluruh file dibaca kecuali Anda berisiko harus mengubah jenis kolom itu ketika Anda membaca nilai terakhir.
Perhatikan contoh satu file yang memiliki kolom bernama user_id. Ini berisi 10 juta baris di mana user_id selalu angka. Karena panda tidak dapat mengetahui bahwa itu hanya angka, panda mungkin akan menyimpannya sebagai string asli sampai ia membaca seluruh file.
Menentukan dtypes (harus selalu dilakukan)
menambahkan
dtype={'user_id': int}
dengan pd.read_csv()
panggilan akan membuat panda tahu ketika mulai membaca file, bahwa ini hanya bilangan bulat.
Juga perlu dicatat adalah bahwa jika baris terakhir dalam file akan "foobar"
ditulis di user_id
kolom, pemuatan akan macet jika dtype di atas ditentukan.
Contoh data rusak yang pecah saat dtypes didefinisikan
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 biasanya hal yang numpy, baca lebih lanjut di sini:
http://docs.scipy.org/doc/numpy/reference/generated/numpy.dtype.html
Dtypes apa yang ada?
Kami memiliki akses ke tipe numpy: float, int, bool, timedelta64 [ns] dan datetime64 [ns]. Perhatikan bahwa dtypes tanggal / waktu numpy tidak mengetahui zona waktu.
Panda memperluas rangkaian tipe ini dengan miliknya sendiri:
'datetime64 [ns,]' Yang merupakan cap waktu sadar zona waktu.
'kategori' yang pada dasarnya adalah enum (string diwakili oleh kunci integer untuk disimpan
'periode []' Tidak perlu bingung dengan timedelta, objek ini sebenarnya berlabuh ke periode waktu tertentu
'Jarang', 'Jarang [int]', 'Jarang [float]' adalah untuk data jarang atau 'Data yang memiliki banyak lubang di dalamnya' Alih-alih menyimpan NaN atau Tidak Ada dalam kerangka data yang menghilangkan objek, menghemat ruang .
'Interval' adalah topiknya sendiri tetapi penggunaan utamanya adalah untuk pengindeksan. Lihat lebih lanjut di sini
'Int8', 'Int16', 'Int32', 'Int64', 'UInt8', 'UInt16', 'UInt32', 'UInt64' adalah semua bilangan bulat spesifik panda yang dapat dibatalkan, tidak seperti varian numpy.
'string' adalah tipe khusus untuk bekerja dengan data string dan memberikan akses ke .str
atribut pada seri.
'boolean' seperti 'bool' yang numpy tetapi juga mendukung data yang hilang.
Baca referensi selengkapnya di sini:
Referensi dtype panda
Gotchas, peringatan, catatan
Pengaturan dtype=object
akan membungkam peringatan di atas, tetapi tidak akan membuatnya lebih hemat memori, hanya proses yang efisien jika ada.
Pengaturan dtype=unicode
tidak akan melakukan apa pun, karena untuk numpy, a unicode
direpresentasikan sebagai object
.
Penggunaan konverter
@sparrow dengan benar menunjukkan penggunaan konverter untuk menghindari panda yang meledak saat bertemu 'foobar'
di kolom yang ditentukan int
. Saya ingin menambahkan bahwa konverter sangat berat dan tidak efisien untuk digunakan dalam panda dan harus digunakan sebagai upaya terakhir. Ini karena proses read_csv adalah proses tunggal.
File CSV dapat diproses baris demi baris dan karenanya dapat diproses oleh banyak konverter secara paralel dengan lebih efisien hanya dengan memotong file menjadi segmen dan menjalankan banyak proses, sesuatu yang tidak didukung panda. Tapi ini cerita yang berbeda.