ก่อนที่จะมีนุ่น 1.0 (จริง ๆ แล้ว 0.25) นี่เป็นวิธีการแยกแยะในการประกาศซีรี่ส์ / คอลัมน์เป็นสตริง:
# 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')
ตั้งแต่ pandas 1.0 เป็นต้นไปให้พิจารณาใช้"string"
typeแทน
# pandas >= 1.0
s = pd.Series(['a', 'b', 'c'], dtype="string")
s.dtype
# StringDtype
นี่คือเหตุผลที่อ้างถึงโดยเอกสาร:
คุณสามารถจัดเก็บส่วนผสมของสตริงและสตริงที่ไม่ได้ตั้งใจในอาร์เรย์ dtype ของวัตถุ มันจะดีกว่าถ้ามี dtype เฉพาะ
object
การดำเนินงานแบ่ง dtype dtype DataFrame.select_dtypes()
เฉพาะเช่น ไม่มีวิธีที่ชัดเจนในการเลือกข้อความเพียงอย่างเดียวในขณะที่ยกเว้นคอลัมน์ที่ไม่ใช่ข้อความ แต่ยังคงเป็นประเภทวัตถุ
เมื่ออ่านรหัสเนื้อหาของobject
อาร์เรย์ dtype 'string'
มีความชัดเจนน้อยกว่า
ดูเพิ่มเติมส่วนที่เกี่ยวกับความแตกต่างระหว่างพฤติกรรม"string"
object
และ
ส่วนขยายประเภท (แนะนำใน 0.24 และเป็นทางการใน 1.0) อยู่ใกล้กับหมีแพนด้ามากกว่าก้อนซึ่งเป็นสิ่งที่ดีเพราะประเภทก้อนไม่มีพลังเพียงพอ ตัวอย่างเช่น NumPy ไม่มีวิธีใด ๆ ในการแสดงข้อมูลที่ขาดหายไปในข้อมูลจำนวนเต็ม (ตั้งแต่type(NaN) == float
) แต่นุ่นสามารถใช้คอลัมน์ Nullable Integerได้
เหตุใดฉันจึงควรหยุดใช้
การผสม dtypes
โดยบังเอิญเหตุผลแรกที่อธิบายไว้ในเอกสารคือคุณสามารถจัดเก็บข้อมูลที่ไม่ใช่ข้อความในคอลัมน์วัตถุโดยไม่ได้ตั้งใจ
# 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.
การท้าทายในการแยกแยะสตริงและวัตถุหลามอื่น ๆ
อีกตัวอย่างที่ชัดเจนคือมันยากที่จะแยกแยะระหว่าง "สตริง" และ "วัตถุ" วัตถุเป็นชนิดครอบคลุมสำหรับประเภทใด ๆ ที่ไม่สนับสนุนการดำเนินการแบบเวกเตอร์
พิจารณา,
# 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
เมื่อถึงหมีแพนด้า 0.25, ไม่มีทางที่จะแยกแยะว่า "A" และ "B" ไม่มีข้อมูลประเภทเดียวกัน
# 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
จากแพนด้า 1.0 สิ่งนี้ง่ายกว่ามาก:
# 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
ความสามารถในการอ่าน
นี่คือการอธิบายตนเอง ;-)
ตกลงฉันควรหยุดใช้ทันทีหรือไม่
... ไม่มี ขณะที่เขียนคำตอบนี้ (เวอร์ชั่น 1.1) ไม่มีประโยชน์ด้านประสิทธิภาพแต่เอกสารคาดว่าการปรับปรุงในอนาคตจะปรับปรุงประสิทธิภาพอย่างมีนัยสำคัญและลดการใช้หน่วยความจำสำหรับ"string"
คอลัมน์ซึ่งตรงข้ามกับวัตถุ ด้วยที่กล่าวว่ามันไม่เคยเร็วเกินไปที่จะสร้างนิสัยที่ดี!
astype("string")
แทนastype(str)
ด้วยเหตุผลที่ดีบ้างลองดู