Saat menelepon
df = pd.read_csv('somefile.csv')
Saya mendapat:
/Users/josh/anaconda/envs/py27/lib/python2.7/site-packages/pandas/io/parsers.py:1130: DtypeWarning: Columns (4,5,7,16) memiliki tipe campuran. Tentukan opsi dtype pada impor atau setel low_memory = Salah.
Mengapa dtype
opsi terkait low_memory
, dan mengapa membuatnya False
membantu dengan masalah ini?
Jawaban:
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
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 diuser_id
kolom, pemuatan akan macet jika dtype di atas ditentukan.Contoh data rusak yang pecah saat dtypes didefinisikan
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, aunicode
direpresentasikan sebagaiobject
.Penggunaan konverter
@sparrow dengan benar menunjukkan penggunaan konverter untuk menghindari panda yang meledak saat bertemu
'foobar'
di kolom yang ditentukanint
. 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.
sumber
dtype=object
tidak lebih hemat memori, apakah ada alasan untuk mengacaukannya selain menyingkirkan kesalahan?error_bad_lines=False, warn_bad_lines=True
harus melakukan trik. Dokumentasi mengatakan itu hanya valid dengan parser C. Ia juga mengatakan parser default adalah Tidak ada yang membuatnya sulit untuk mengetahui mana yang merupakan default.nrows=100
sebagai argumen dan kemudian lakukandf.dtypes
untuk melihat dtypes yang Anda dapatkan. Namun, ketika membaca seluruh kerangka data dengan dtypes ini, pastikan untuk melakukantry/except
sehingga Anda menangkap dugaan dtype yang salah. Data kotor lho.Mencoba:
Menurut dokumentasi panda:
Sedangkan untuk low_memory, itu Benar secara default dan belum didokumentasikan. Saya pikir itu tidak relevan. Pesan galatnya generik, jadi Anda tidak perlu repot dengan low_memory. Semoga ini bisa membantu dan beri tahu saya jika Anda memiliki masalah lebih lanjut
sumber
dtype=unicode
dihasilkan:NameError: name 'unicode' is not defined
. Tetapi memasukkanunicode
tanda kutip (seperti dalam 'unicode') tampaknya berhasil!numpy.dtype('unicode')
. Ketika Anda memberikan opsi dtype string, itu akan mencoba untuk melemparkannya melaluinumpy.dtype()
pabrik secara default. Menentukan'unicode'
sebenarnya tidak akan melakukan apa-apa, hanya unicodes upcastedobjects
. Anda akan mendapatkandtype='object'
Ini harus menyelesaikan masalah. Saya mendapatkan kesalahan yang persis sama, ketika membaca 1,8M baris dari CSV.
sumber
Seperti yang disebutkan sebelumnya oleh firelynx jika dtype ditentukan secara eksplisit dan ada data campuran yang tidak kompatibel dengan dtype itu maka memuat akan macet. Saya menggunakan konverter seperti ini sebagai solusi untuk mengubah nilai dengan tipe data yang tidak kompatibel sehingga data masih bisa dimuat.
sumber
Saya memiliki masalah serupa dengan file ~ 400MB. Pengaturan
low_memory=False
melakukan trik untuk saya. Lakukan hal-hal sederhana terlebih dahulu, saya akan memeriksa bahwa frame data Anda tidak lebih besar dari memori sistem Anda, reboot, hapus RAM sebelum melanjutkan. Jika Anda masih mengalami kesalahan, pastikan.csv
file Anda baik-baik saja, lihat cepat di Excel dan pastikan tidak ada kerusakan yang jelas. Data asli yang rusak dapat menyebabkan ...sumber
Saya menghadapi masalah serupa ketika memproses file csv besar (6 juta baris). Saya memiliki tiga masalah: 1. file berisi karakter aneh (tetap menggunakan pengkodean) 2. datatype tidak ditentukan (tetap menggunakan properti dtype) 3. Menggunakan di atas saya masih menghadapi masalah yang berkaitan dengan file_format yang tidak bisa didefinisikan berdasarkan nama file (tetap menggunakan coba .. kecuali ..)
sumber
Ini bekerja untuk saya
low_memory = False
saat mengimpor DataFrame. Itulah semua perubahan yang berhasil bagi saya:sumber