Panda 1.0'dan önce (aslında, aslında 0.25), bir Diziyi / sütunu dize olarak bildirmenin kesin yoluydu:
# 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')
Panda 1.0'dan itibaren, bunun yerine "string"
türü kullanmayı düşünün .
# pandas >= 1.0
s = pd.Series(['a', 'b', 'c'], dtype="string")
s.dtype
# StringDtype
Dokümanlar tarafından alıntılandığı gibi, bunun nedeni şudur:
Yanlışlıkla bir dize ve dize olmayan karışımı bir nesne dtype dizisinde saklayabilirsiniz. Özel bir dtype sahip olmak daha iyidir.
object
dtype gibi dtype'ye özgü işlemleri keser DataFrame.select_dtypes()
. Metin olmayan, ancak yine de nesne dtype sütunlarını hariç tutarken yalnızca metni seçmenin net bir yolu yoktur.
Kodu okurken, object
dtype dizisinin içeriği daha az açıktır 'string'
.
Ayrıca bölümüne bakın arasındaki Davranış Farklılıkları "string"
veobject
.
Genişletme türleri (0.24'te tanıtılan ve 1.0'da resmileştirilen), sayısal değerlere göre pandalara daha yakındır, bu da iyidir, çünkü numpy türleri yeterince güçlü değildir. Örneğin, NumPy'nin tamsayı verilerinde eksik verileri temsil etmenin bir yolu yoktur (o zamandan beri type(NaN) == float
). Ancak pandalar Nullable Integer sütunlarını kullanabilir .
Neden kullanmayı bırakmalıyım?
Türleri yanlışlıkla karıştırma
Dokümanlarda belirtildiği gibi ilk neden, metin dışı verileri yanlışlıkla nesne sütunlarında depolayabilmenizdir.
# 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.
Dizeleri ve diğer python nesnelerini
ayırt etmek zor. Bir diğer bariz örnek, "dizeler" ve "nesneler" arasında ayrım yapmanın daha zor olmasıdır. Nesneler, vektörleştirilebilirliği desteklemeyen herhangi bir tür için temelde battaniye türüdür işlemleri .
Düşünmek,
# 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
Pandalar 0.25'e kadar, "A" ve "B" nin aynı tipte verilere sahip olmadığını ayırt etmenin neredeyse hiçbir yolu yoktu.
# 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
Pandalar 1.0'dan, bu çok daha basit hale gelir:
# 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
Okunabilirlik
Bu açıklayıcıdır ;-)
Tamam, şimdi kullanmayı bırakmalı mıyım?
...Hayır. Bu yanıtı yazdığınızda (sürüm 1.1), hiçbir performans avantajı yoktur ancak dokümanlar gelecekteki geliştirmelerin "string"
nesneleri önemli ölçüde iyileştirmesini ve sütunların nesnelerin aksine sütun kullanımını azaltmasını bekler . Bununla birlikte, iyi alışkanlıklar oluşturmak için asla çok erken değildir!
astype("string")
astype(str)
oldukça iyi nedenler yerine kullanılmasını önerir , bir göz atın.