Sebelum panda 1.0 (sebenarnya, 0,25 sebenarnya) ini adalah cara defacto untuk mendeklarasikan Seri / kolom sebagai string:
# pandas <= 0.25
# Note to pedants: specifying the type is unnecessary since pandas will
# automagically infer the type as object
s = pd.Series(['a', 'b', 'c'], dtype=str)
s.dtype
# dtype('O')
Dari panda 1.0 dan seterusnya, pertimbangkan untuk menggunakan "string"
tipe .
# pandas >= 1.0
s = pd.Series(['a', 'b', 'c'], dtype="string")
s.dtype
# StringDtype
Inilah sebabnya, seperti dikutip oleh dokumen:
Anda dapat secara tidak sengaja menyimpan campuran string dan non-string dalam array objek tipe. Lebih baik memiliki tipe khusus.
object
dtype memecah operasi spesifik seperti dtype DataFrame.select_dtypes()
. Tidak ada cara yang jelas untuk memilih hanya teks sambil mengecualikan kolom non-teks tetapi masih objek-dtype.
Saat membaca kode, isi object
array dtype kurang jelas 'string'
.
Lihat juga bagian tentang Perbedaan Perilaku antara "string"
danobject
.
Jenis ekstensi (diperkenalkan pada 0,24 dan diformalkan dalam 1,0) lebih dekat ke panda daripada numpy, yang baik karena tipe numpy tidak cukup kuat. Misalnya NumPy tidak memiliki cara untuk mewakili data yang hilang dalam data integer (sejak type(NaN) == float
). Tetapi panda dapat menggunakan kolom Nullable Integer .
Mengapa saya harus berhenti menggunakannya?
Pencampuran dtypes secara tidak sengaja
Alasan pertama, seperti yang dijelaskan dalam dokumen adalah bahwa Anda dapat secara tidak sengaja menyimpan data non-teks dalam kolom objek.
# pandas <= 0.25
pd.Series(['a', 'b', 1.23]) # whoops, this should have been "1.23"
0 a
1 b
2 1.23
dtype: object
pd.Series(['a', 'b', 1.23]).tolist()
# ['a', 'b', 1.23] # oops, pandas was storing this as float all the time.
# pandas >= 1.0
pd.Series(['a', 'b', 1.23], dtype="string")
0 a
1 b
2 1.23
dtype: string
pd.Series(['a', 'b', 1.23], dtype="string").tolist()
# ['a', 'b', '1.23'] # it's a string and we just averted some potentially nasty bugs.
Menantang untuk membedakan string dan objek python
lainnya Contoh contoh nyata lainnya adalah bahwa lebih sulit untuk membedakan antara "string" dan "objek". Objek pada dasarnya adalah tipe selimut untuk semua jenis yang tidak mendukung vectorizable operasi yang dapat di .
Mempertimbangkan,
# Setup
df = pd.DataFrame({'A': ['a', 'b', 'c'], 'B': [{}, [1, 2, 3], 123]})
df
A B
0 a {}
1 b [1, 2, 3]
2 c 123
Hingga panda 0,25, hampir tidak ada cara untuk membedakan bahwa "A" dan "B" tidak memiliki tipe data yang sama.
# pandas <= 0.25
df.dtypes
A object
B object
dtype: object
df.select_dtypes(object)
A B
0 a {}
1 b [1, 2, 3]
2 c 123
Dari panda 1.0, ini menjadi jauh lebih sederhana:
# pandas >= 1.0
# Convenience function I call to help illustrate my point.
df = df.convert_dtypes()
df.dtypes
A string
B object
dtype: object
df.select_dtypes("string")
A
0 a
1 b
2 c
Keterbacaan
Ini cukup jelas ;-)
OK, jadi haruskah saya berhenti menggunakannya sekarang?
...Tidak. Pada penulisan jawaban ini (versi 1.1), tidak ada manfaat kinerja tetapi dokumen mengharapkan peningkatan di masa mendatang untuk secara signifikan meningkatkan kinerja dan mengurangi penggunaan memori untuk "string"
kolom yang bertentangan dengan objek. Namun demikian, tidak pernah terlalu dini untuk membentuk kebiasaan baik!
astype("string")
daripadaastype(str)
untuk beberapa alasan yang cukup bagus, lihatlah.