Mengapa Pandas memberi tahu saya bahwa saya memiliki objek, meskipun setiap item di kolom yang dipilih adalah string - bahkan setelah konversi eksplisit.
Ini adalah DataFrame saya:
<class 'pandas.core.frame.DataFrame'>
Int64Index: 56992 entries, 0 to 56991
Data columns (total 7 columns):
id 56992 non-null values
attr1 56992 non-null values
attr2 56992 non-null values
attr3 56992 non-null values
attr4 56992 non-null values
attr5 56992 non-null values
attr6 56992 non-null values
dtypes: int64(2), object(5)
Lima di antaranya adalah dtype object
. Saya secara eksplisit mengonversi objek-objek itu menjadi string:
for c in df.columns:
if df[c].dtype == object:
print "convert ", df[c].name, " to string"
df[c] = df[c].astype(str)
Kemudian, df["attr2"]
masih memiliki dtype object
, meskipun type(df["attr2"].ix[0]
mengungkapkan str
, mana yang benar.
Panda membedakan antara int64
dan float64
dan object
. Apa logika di baliknya bila tidak ada dtype str
? Mengapa str
dilindungi oleh object
?
Jawaban:
Objek dtype berasal dari NumPy, ini menjelaskan tipe elemen dalam ndarray. Setiap elemen dalam ndarray harus memiliki ukuran yang sama dalam byte. Untuk int64 dan float64, ukurannya 8 byte. Namun untuk senar, panjang senar tidak tetap. Jadi, alih-alih menyimpan byte string dalam ndarray secara langsung, Pandas menggunakan objek ndarray, yang menyimpan pointer ke objek, karena jenis ini ndarray adalah objek.
Berikut ini contohnya:
sumber
Jawaban yang diterima bagus. Hanya ingin memberikan jawaban yang mereferensikan dokumentasi . Dokumentasinya mengatakan:
Seperti komentar utama mengatakan "Jangan khawatir tentang itu; seharusnya seperti ini." (Meskipun jawaban yang diterima melakukan pekerjaan yang baik dalam menjelaskan "mengapa"; string memiliki panjang variabel)
sumber
astype(str)
meskipun saya masih bertanya-tanya konversi string diperlukan@ HYRY Jawabannya bagus. Saya hanya ingin memberikan lebih banyak konteks ..
Array disimpan data yang berdekatan , berukuran tetap blok memori. Kombinasi properti ini bersama-sama membuat array menjadi secepat kilat untuk akses data. Misalnya, pertimbangkan bagaimana komputer Anda dapat menyimpan larik bilangan bulat 32-bit
[3,0,1]
,.Jika Anda meminta komputer Anda untuk mengambil elemen ke-3 dalam larik, itu akan dimulai dari awal dan kemudian melompati 64 bit untuk sampai ke elemen ke-3. Mengetahui dengan tepat berapa banyak bit untuk dilompati itulah yang membuat array menjadi cepat .
Sekarang perhatikan urutan string
['hello', 'i', 'am', 'a', 'banana']
. String adalah objek yang ukurannya bervariasi, jadi jika Anda mencoba menyimpannya di blok memori yang berdekatan, hasilnya akan terlihat seperti ini.Sekarang komputer Anda tidak memiliki cara cepat untuk mengakses elemen yang diminta secara acak. Kunci untuk mengatasi ini adalah dengan menggunakan petunjuk. Pada dasarnya, simpan setiap string di beberapa lokasi memori acak, dan isi array dengan alamat memori setiap string. (Alamat memori hanyalah bilangan bulat.) Jadi sekarang, semuanya terlihat seperti ini
Sekarang, jika Anda meminta komputer Anda untuk mengambil elemen ke-3, seperti sebelumnya, itu dapat melompati 64 bit (dengan asumsi alamat memori adalah bilangan bulat 32-bit) dan kemudian membuat satu langkah ekstra untuk mengambil string.
Tantangan bagi NumPy adalah tidak ada jaminan bahwa pointer benar-benar mengarah ke string. Itulah mengapa ini melaporkan tipe dtype sebagai 'object'.
Tanpa malu-malu akan pasang artikel blog saya sendiri tempat saya pertama kali membahas ini.
sumber
Mulai versi 1.0.0 (Januari 2020), panda telah diperkenalkan sebagai fitur eksperimental yang menyediakan dukungan kelas satu untuk jenis string melalui
pandas.StringDtype
.Meskipun Anda masih dapat melihat
object
secara default, tipe baru dapat digunakan dengan menentukandtype
daripd.StringDtype
atau cukup'string'
:sumber
The implementation may change without warning.
yang berarti pembaruan baru akan merusak program lama Anda.