Saya ingin mengonversi tabel, direpresentasikan sebagai daftar daftar, menjadi a Pandas DataFrame
. Sebagai contoh yang sangat sederhana:
a = [['a', '1.2', '4.2'], ['b', '70', '0.03'], ['x', '5', '0']]
df = pd.DataFrame(a)
Apa cara terbaik untuk mengubah kolom ke tipe yang sesuai, dalam hal ini kolom 2 dan 3 menjadi pelampung? Apakah ada cara untuk menentukan tipe saat mengonversi ke DataFrame? Atau lebih baik untuk membuat DataFrame terlebih dahulu dan kemudian melalui kolom untuk mengubah jenis untuk setiap kolom? Idealnya saya ingin melakukan ini dengan cara yang dinamis karena mungkin ada ratusan kolom dan saya tidak ingin menentukan kolom mana yang jenisnya tepat. Yang bisa saya jamin adalah bahwa setiap kolom berisi nilai dari tipe yang sama.
df.apply(pd.to_numeric, downcast="integer", errors="ignore")
downcast kolom integer ke tipe (integer) terkecil yang akan menampung nilai-nilai.Jawaban:
Anda memiliki tiga opsi utama untuk mengonversi jenis dalam panda:
to_numeric()
- menyediakan fungsionalitas untuk secara aman mengkonversi tipe non-numerik (mis. string) ke tipe numerik yang sesuai. (Lihat jugato_datetime()
danto_timedelta()
.)astype()
- Mengkonversi (hampir) jenis apa pun menjadi (hampir) jenis lain (bahkan jika itu tidak selalu masuk akal untuk melakukannya). Anda juga dapat mengonversi ke jenis kategororial (sangat berguna).infer_objects()
- metode utilitas untuk mengonversi kolom objek yang menyimpan objek Python ke tipe panda jika memungkinkan.Baca terus untuk penjelasan lebih lanjut dan penggunaan masing-masing metode ini.
1.
to_numeric()
Cara terbaik untuk mengonversi satu atau beberapa kolom DataFrame ke nilai numerik adalah dengan menggunakannya
pandas.to_numeric()
.Fungsi ini akan mencoba mengubah objek non-numerik (seperti string) menjadi bilangan bulat atau angka floating point yang sesuai.
Penggunaan dasar
Input ke
to_numeric()
adalah Seri atau kolom tunggal dari DataFrame.Seperti yang Anda lihat, Seri baru dikembalikan. Ingatlah untuk menetapkan output ini ke nama variabel atau kolom untuk terus menggunakannya:
Anda juga dapat menggunakannya untuk mengonversi beberapa kolom DataFrame melalui
apply()
metode:Selama semua nilai Anda dapat dikonversi, mungkin itu yang Anda butuhkan.
Menangani kesalahan
Tetapi bagaimana jika beberapa nilai tidak dapat dikonversi ke tipe numerik?
to_numeric()
juga mengambilerrors
argumen kata kunci yang memungkinkan Anda untuk memaksa nilai non-numerikNaN
, atau mengabaikan kolom yang berisi nilai-nilai ini.Berikut ini contoh menggunakan serangkaian string
s
yang memiliki objek tipe:Perilaku default adalah untuk meningkatkan jika tidak dapat mengonversi nilai. Dalam hal ini, itu tidak dapat mengatasi string 'panda':
Daripada gagal, kita mungkin ingin 'panda' dianggap sebagai nilai numerik yang hilang / buruk. Kami dapat memaksa nilai yang tidak valid ke
NaN
sebagai berikut menggunakanerrors
argumen kata kunci:Opsi ketiga
errors
adalah mengabaikan operasi jika ada nilai yang tidak valid:Opsi terakhir ini sangat berguna ketika Anda ingin mengonversi seluruh DataFrame Anda, tetapi tidak tahu kolom mana dari kami yang dapat dikonversi secara andal ke tipe numerik. Kalau begitu tulis saja:
Fungsi akan diterapkan ke setiap kolom DataFrame. Kolom yang dapat dikonversi ke tipe numerik akan dikonversi, sedangkan kolom yang tidak bisa (misalnya mengandung string atau tanggal non-digit) akan dibiarkan sendiri.
Downcasting
Secara default, konversi dengan
to_numeric()
akan memberi Anda tipeint64
ataufloat64
dtype (atau lebar integer apa pun yang asli untuk platform Anda).Itu biasanya yang Anda inginkan, tetapi bagaimana jika Anda ingin menghemat memori dan menggunakan tipe yang lebih ringkas, seperti
float32
, atauint8
?to_numeric()
memberi Anda pilihan untuk downcast ke 'integer', 'ditandatangani', 'unsigned', 'float'. Berikut ini contoh untuk serangkaian sederhanas
tipe integer:Downcasting ke 'integer' menggunakan integer terkecil yang bisa menampung nilai-nilai:
Downcasting ke 'float' juga memilih tipe mengambang yang lebih kecil dari normal:
2.
astype()
The
astype()
Metode memungkinkan Anda untuk menjadi eksplisit tentang dtype Anda ingin DataFrame atau Series untuk memiliki. Ini sangat fleksibel karena Anda dapat mencoba dan beralih dari satu jenis ke jenis lainnya.Penggunaan dasar
Cukup pilih satu jenis: Anda dapat menggunakan dtype NumPy (mis.
np.int16
), Beberapa jenis Python (misalnya bool), atau tipe khusus panda (seperti dtype kategoris).Panggil metode pada objek yang ingin Anda konversi dan
astype()
akan mencoba dan mengubahnya untuk Anda:Perhatikan saya katakan "coba" - jika
astype()
tidak tahu cara mengonversi nilai dalam Seri atau DataFrame, itu akan menimbulkan kesalahan. Misalnya jika Anda memilikiNaN
atauinf
nilai Anda akan mendapatkan kesalahan saat mencoba mengubahnya menjadi integer.Pada panda 0.20.0, kesalahan ini dapat ditekan dengan melewati
errors='ignore'
. Objek asli Anda akan kembali tidak tersentuh.Hati-hati
astype()
memang kuat, tetapi terkadang akan mengonversi nilai "salah". Sebagai contoh:Ini adalah bilangan bulat kecil, jadi bagaimana dengan mengkonversi ke tipe 8-bit yang tidak ditandatangani untuk menghemat memori?
Konversi berhasil, tetapi -7 dibungkus menjadi 249 (yaitu 2 8 - 7)!
Mencoba downcast menggunakan
pd.to_numeric(s, downcast='unsigned')
sebagai gantinya dapat membantu mencegah kesalahan ini.3.
infer_objects()
Versi 0.21.0 panda memperkenalkan metode
infer_objects()
untuk mengkonversi kolom DataFrame yang memiliki tipe data objek ke tipe yang lebih spesifik (konversi lembut).Misalnya, inilah DataFrame dengan dua kolom tipe objek. Satu memegang bilangan bulat aktual dan lainnya memegang string yang mewakili bilangan bulat:
Dengan menggunakan
infer_objects()
, Anda dapat mengubah jenis kolom 'a' menjadi int64:Kolom 'b' ditinggalkan sendiri karena nilainya adalah string, bukan bilangan bulat. Jika Anda ingin mencoba dan memaksa konversi kedua kolom ke tipe integer, Anda bisa menggunakannya
df.astype(int)
.sumber
.convert_objects
dihentikan sejak0.17
- gunakandf.to_numeric
sebagai gantinyapd.to_numeric
dan metode pendampingnya hanya akan bekerja pada satu kolom pada satu waktu, tidak seperticonvert_objects
. Diskusi tentang fungsi penggantian di API tampaknya sedang berlangsung ; Saya harap metode yang berfungsi di seluruh DataFrame akan tetap ada karena sangat berguna.int64
menjadiint32
?astype
(seperti pada jawaban lainnya), yaitu.astype(numpy.int32)
.Bagaimana dengan ini?
sumber
pd.DataFrame
memilikidtype
argumen yang mungkin membuat Anda melakukan apa yang Anda cari. df = pd.DataFrame (a, kolom = ['satu', 'dua', 'tiga'], dtype = float) Dalam [2]: df.dtypes Out [2]: satu objek dua float64 tiga float64 dtype: objekSettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_index,col_indexer] = value instead
. Ini mungkin telah diperkenalkan di versi panda yang lebih baru dan saya tidak melihat ada yang salah sebagai hasilnya, tapi saya hanya ingin tahu apa peringatan ini. Ada ide?ValueError: Cannot convert NA to integer
df = pd.DataFrame(a, columns=['one', 'two', 'three'], dtype={'one': str, 'two': int, 'three': float})
. Saya kesulitan menemukan spesifikasi untuk nilai "dtype" yang diterima. Daftar akan lebih baik (saat ini saya lakukandict(enumerate(my_list))
).kode di bawah ini akan mengubah tipe data kolom.
di tempat tipe data Anda dapat memberikan tipe data Anda. apa yang Anda inginkan seperti str, float, int dll.
sumber
bool
, semuanya berubah menjadiTrue
.Ketika saya hanya perlu menentukan kolom tertentu, dan saya ingin menjadi eksplisit, saya telah menggunakan (per DOCS LOCATION ):
Jadi, menggunakan pertanyaan asli, tetapi memberikan nama kolom untuk itu ...
sumber
Berikut adalah fungsi yang mengambil sebagai argumen DataFrame dan daftar kolom dan memaksa semua data dalam kolom ke angka.
Jadi, untuk contoh Anda:
sumber
Bagaimana dengan membuat dua kerangka data, masing-masing dengan tipe data yang berbeda untuk kolomnya, dan kemudian menambahkannya bersama?
Hasil
Setelah bingkai data dibuat, Anda dapat mengisinya dengan variabel titik mengambang di kolom 1, dan string (atau tipe data apa pun yang Anda inginkan) di kolom ke-2.
sumber
panda> = 1.0
Berikut adalah bagan yang merangkum beberapa konversi terpenting dalam panda.
Konversi ke string sepele
.astype(str)
dan tidak ditampilkan dalam gambar.Konversi "Keras" versus "Lembut"
Perhatikan bahwa "konversi" dalam konteks ini dapat merujuk pada konversi data teks menjadi tipe data aktual (konversi keras), atau menyimpulkan tipe data yang lebih tepat untuk data dalam kolom objek (konversi lunak). Untuk mengilustrasikan perbedaannya, lihat
sumber
Saya pikir saya memiliki masalah yang sama tetapi sebenarnya saya memiliki sedikit perbedaan yang membuat masalah lebih mudah untuk diselesaikan. Bagi orang lain yang melihat pertanyaan ini, ada baiknya memeriksa format daftar input Anda. Dalam kasus saya angka awalnya mengapung bukan string seperti dalam pertanyaan:
tetapi dengan memproses daftar terlalu banyak sebelum membuat dataframe saya kehilangan tipe dan semuanya menjadi string.
Membuat bingkai data melalui array numpy
memberikan bingkai data yang sama seperti pada pertanyaan, di mana entri dalam kolom 1 dan 2 dianggap sebagai string. Namun melakukan
benar-benar memberikan bingkai data dengan kolom dalam format yang benar
sumber
Mulai panda 1.0.0, kami punya
pandas.DataFrame.convert_dtypes
. Anda bahkan dapat mengontrol tipe yang akan dikonversi!sumber