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 juga to_datetime()
dan to_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.
>>> s = pd.Series(["8", 6, "7.5", 3, "0.9"]) # mixed string and numeric values
>>> s
0 8
1 6
2 7.5
3 3
4 0.9
dtype: object
>>> pd.to_numeric(s) # convert everything to float values
0 8.0
1 6.0
2 7.5
3 3.0
4 0.9
dtype: float64
Seperti yang Anda lihat, Seri baru dikembalikan. Ingatlah untuk menetapkan output ini ke nama variabel atau kolom untuk terus menggunakannya:
# convert Series
my_series = pd.to_numeric(my_series)
# convert column "a" of a DataFrame
df["a"] = pd.to_numeric(df["a"])
Anda juga dapat menggunakannya untuk mengonversi beberapa kolom DataFrame melalui apply()
metode:
# convert all columns of DataFrame
df = df.apply(pd.to_numeric) # convert all columns of DataFrame
# convert just columns "a" and "b"
df[["a", "b"]] = df[["a", "b"]].apply(pd.to_numeric)
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 mengambil errors
argumen kata kunci yang memungkinkan Anda untuk memaksa nilai non-numerik NaN
, atau mengabaikan kolom yang berisi nilai-nilai ini.
Berikut ini contoh menggunakan serangkaian string s
yang memiliki objek tipe:
>>> s = pd.Series(['1', '2', '4.7', 'pandas', '10'])
>>> s
0 1
1 2
2 4.7
3 pandas
4 10
dtype: object
Perilaku default adalah untuk meningkatkan jika tidak dapat mengonversi nilai. Dalam hal ini, itu tidak dapat mengatasi string 'panda':
>>> pd.to_numeric(s) # or pd.to_numeric(s, errors='raise')
ValueError: Unable to parse string
Daripada gagal, kita mungkin ingin 'panda' dianggap sebagai nilai numerik yang hilang / buruk. Kami dapat memaksa nilai yang tidak valid ke NaN
sebagai berikut menggunakan errors
argumen kata kunci:
>>> pd.to_numeric(s, errors='coerce')
0 1.0
1 2.0
2 4.7
3 NaN
4 10.0
dtype: float64
Opsi ketiga errors
adalah mengabaikan operasi jika ada nilai yang tidak valid:
>>> pd.to_numeric(s, errors='ignore')
# the original Series is returned untouched
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:
df.apply(pd.to_numeric, errors='ignore')
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 tipe int64
atau float64
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
, atau int8
?
to_numeric()
memberi Anda pilihan untuk downcast ke 'integer', 'ditandatangani', 'unsigned', 'float'. Berikut ini contoh untuk serangkaian sederhana s
tipe integer:
>>> s = pd.Series([1, 2, -7])
>>> s
0 1
1 2
2 -7
dtype: int64
Downcasting ke 'integer' menggunakan integer terkecil yang bisa menampung nilai-nilai:
>>> pd.to_numeric(s, downcast='integer')
0 1
1 2
2 -7
dtype: int8
Downcasting ke 'float' juga memilih tipe mengambang yang lebih kecil dari normal:
>>> pd.to_numeric(s, downcast='float')
0 1.0
1 2.0
2 -7.0
dtype: float32
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:
# convert all DataFrame columns to the int64 dtype
df = df.astype(int)
# convert column "a" to int64 dtype and "b" to complex type
df = df.astype({"a": int, "b": complex})
# convert Series to float16 type
s = s.astype(np.float16)
# convert Series to Python strings
s = s.astype(str)
# convert Series to categorical type - see docs for more details
s = s.astype('category')
Perhatikan saya katakan "coba" - jika astype()
tidak tahu cara mengonversi nilai dalam Seri atau DataFrame, itu akan menimbulkan kesalahan. Misalnya jika Anda memiliki NaN
atau inf
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:
>>> s = pd.Series([1, 2, -7])
>>> s
0 1
1 2
2 -7
dtype: int64
Ini adalah bilangan bulat kecil, jadi bagaimana dengan mengkonversi ke tipe 8-bit yang tidak ditandatangani untuk menghemat memori?
>>> s.astype(np.uint8)
0 1
1 2
2 249
dtype: uint8
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:
>>> df = pd.DataFrame({'a': [7, 1, 5], 'b': ['3','2','1']}, dtype='object')
>>> df.dtypes
a object
b object
dtype: object
Dengan menggunakan infer_objects()
, Anda dapat mengubah jenis kolom 'a' menjadi int64:
>>> df = df.infer_objects()
>>> df.dtypes
a int64
b object
dtype: object
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)
.