คุณมีสามตัวเลือกหลักสำหรับการแปลงประเภทในนุ่น:
to_numeric()
- จัดให้มีฟังก์ชั่นการแปลงประเภทที่ไม่ใช่ตัวเลข (เช่นสตริง) ได้อย่างปลอดภัยเป็นประเภทตัวเลขที่เหมาะสม (ดูเพิ่มเติมที่to_datetime()
และto_timedelta()
.)
astype()
- แปลง (เกือบ) ประเภทใด ๆ เป็น (เกือบ) ประเภทอื่น ๆ (แม้ว่าจะไม่จำเป็นต้องทำเช่นนั้น) ยังช่วยให้คุณสามารถแปลงเป็นประเภท categorial (มีประโยชน์มาก)
infer_objects()
- วิธีการยูทิลิตี้ในการแปลงคอลัมน์วัตถุที่ถือวัตถุหลามเป็นชนิดแพนด้าถ้าเป็นไปได้
อ่านรายละเอียดเพิ่มเติมเกี่ยวกับคำอธิบายและการใช้งานของแต่ละวิธี
1 to_numeric()
วิธีที่ดีที่สุดในการแปลงหนึ่งหรือมากกว่าหนึ่งคอลัมน์ของ DataFrame pandas.to_numeric()
ไปเป็นค่าตัวเลขคือการใช้งาน
ฟังก์ชันนี้จะพยายามเปลี่ยนวัตถุที่ไม่ใช่ตัวเลข (เช่นสตริง) เป็นจำนวนเต็มหรือตัวเลขทศนิยมตามความเหมาะสม
การใช้งานขั้นพื้นฐาน
อินพุตto_numeric()
เป็น Series หรือคอลัมน์เดียวของ 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
อย่างที่คุณเห็นซีรีส์ใหม่จะถูกส่งคืน อย่าลืมกำหนดผลลัพธ์นี้ให้กับตัวแปรหรือชื่อคอลัมน์เพื่อใช้งานต่อไป:
# convert Series
my_series = pd.to_numeric(my_series)
# convert column "a" of a DataFrame
df["a"] = pd.to_numeric(df["a"])
คุณสามารถใช้มันเพื่อแปลงหลายคอลัมน์ของ DataFrame ด้วยapply()
วิธีการ:
# 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)
ตราบใดที่ค่าของคุณสามารถแปลงได้นั่นก็เป็นสิ่งที่คุณต้องการ
การจัดการข้อผิดพลาด
แต่ถ้าหากค่าบางอย่างไม่สามารถแปลงเป็นประเภทตัวเลขได้
to_numeric()
ยังใช้errors
อาร์กิวเมนต์คำหลักที่ช่วยให้คุณสามารถบังคับให้ค่าที่ไม่ใช่ตัวเลขNaN
หรือเพียงแค่ละเว้นคอลัมน์ที่มีค่าเหล่านี้
นี่คือตัวอย่างการใช้ชุดของสตริงs
ที่มีวัตถุ dtype:
>>> s = pd.Series(['1', '2', '4.7', 'pandas', '10'])
>>> s
0 1
1 2
2 4.7
3 pandas
4 10
dtype: object
พฤติกรรมเริ่มต้นคือการเพิ่มถ้ามันไม่สามารถแปลงค่า ในกรณีนี้มันไม่สามารถรับมือกับสตริง 'pandas':
>>> pd.to_numeric(s) # or pd.to_numeric(s, errors='raise')
ValueError: Unable to parse string
แทนที่จะล้มเหลวเราอาจต้องการให้ 'แพนด้า' ถูกพิจารณาว่าเป็นตัวเลขที่หายไป / ไม่ดี เราสามารถบีบบังคับค่าที่ไม่ถูกต้องNaN
เป็นดังนี้โดยใช้errors
อาร์กิวเมนต์คำหลัก:
>>> pd.to_numeric(s, errors='coerce')
0 1.0
1 2.0
2 4.7
3 NaN
4 10.0
dtype: float64
ตัวเลือกที่สามสำหรับerrors
เพียงเพื่อละเว้นการดำเนินการหากพบค่าที่ไม่ถูกต้อง:
>>> pd.to_numeric(s, errors='ignore')
# the original Series is returned untouched
ตัวเลือกสุดท้ายนี้มีประโยชน์อย่างยิ่งเมื่อคุณต้องการแปลง DataFrame ทั้งหมดของคุณ แต่ไม่ทราบว่าคอลัมน์ใดของเราที่สามารถแปลงเป็นประเภทตัวเลขได้อย่างน่าเชื่อถือ ในกรณีนั้นเพียงแค่เขียน:
df.apply(pd.to_numeric, errors='ignore')
ฟังก์ชั่นจะถูกนำไปใช้กับแต่ละคอลัมน์ของ DataFrame คอลัมน์ที่สามารถแปลงเป็นประเภทตัวเลขจะถูกแปลงในขณะที่คอลัมน์ที่ไม่สามารถ (เช่นมีสตริงหรือวันที่ที่ไม่ใช่ตัวเลข) จะถูกทิ้งไว้ตามลำพัง
Downcasting
ตามค่าเริ่มต้นการแปลงด้วยto_numeric()
จะให้ a int64
หรือfloat64
dtype (หรือความกว้างของจำนวนเต็มใด ๆ ที่เป็นพื้นฐานของแพลตฟอร์มของคุณ)
โดยปกติแล้วเป็นสิ่งที่คุณต้องการ แต่ถ้าคุณต้องการที่จะบันทึกหน่วยความจำบางส่วนและใช้รูปแบบที่กะทัดรัดกว่าเช่นfloat32
หรือint8
?
to_numeric()
ให้ตัวเลือกแก่คุณในการลดระดับลงเป็น 'จำนวนเต็ม', 'ลงนาม', 'ไม่ได้ลงนาม', 'ลอย' นี่คือตัวอย่างสำหรับชุดs
จำนวนเต็มแบบง่าย ๆ:
>>> s = pd.Series([1, 2, -7])
>>> s
0 1
1 2
2 -7
dtype: int64
การลดระดับลงเป็น 'จำนวนเต็ม' ใช้จำนวนเต็มที่น้อยที่สุดเท่าที่จะเป็นไปได้ซึ่งสามารถเก็บค่าได้:
>>> pd.to_numeric(s, downcast='integer')
0 1
1 2
2 -7
dtype: int8
Downcasting เป็น 'float' ในทำนองเดียวกันจะเลือกประเภทลอยที่เล็กกว่าปกติ:
>>> pd.to_numeric(s, downcast='float')
0 1.0
1 2.0
2 -7.0
dtype: float32
2 astype()
astype()
วิธีช่วยให้คุณมีความชัดเจนเกี่ยวกับ dtype ที่คุณต้องการ DataFrame หรือซีรีส์ของคุณมี มีหลากหลายมากที่คุณสามารถลองใช้จากประเภทหนึ่งไปยังอีกประเภทหนึ่ง
การใช้งานขั้นพื้นฐาน
เพียงเลือกประเภท: คุณสามารถใช้ NumPy dtype (เช่นnp.int16
) ประเภท Python บางประเภท (เช่นบูล) หรือประเภทเฉพาะของแพนด้า (เช่นประเภทเด็ดขาด)
เรียกวิธีการบนวัตถุที่คุณต้องการแปลงและastype()
จะลองและแปลงให้คุณ:
# 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')
แจ้งให้ทราบastype()
ล่วงหน้าฉันพูดว่า "ลอง" - หากไม่ทราบวิธีการแปลงค่าในซีรีส์หรือ DataFrame มันจะเพิ่มข้อผิดพลาด ตัวอย่างเช่นหากคุณมีNaN
หรือinf
ค่าคุณจะได้รับข้อผิดพลาดในการพยายามแปลงให้เป็นจำนวนเต็ม
ตั้งแต่ pandas 0.20.0 ข้อผิดพลาดนี้สามารถถูกระงับได้โดยผ่าน errors='ignore'
ข้อผิดพลาดนี้สามารถระงับโดยผ่าน วัตถุดั้งเดิมของคุณจะถูกส่งคืนโดยไม่มีการแตะต้อง
ระวัง
astype()
มีประสิทธิภาพ แต่บางครั้งมันจะแปลงค่า "ไม่ถูกต้อง" ตัวอย่างเช่น:
>>> s = pd.Series([1, 2, -7])
>>> s
0 1
1 2
2 -7
dtype: int64
เหล่านี้เป็นจำนวนเต็มขนาดเล็กดังนั้นวิธีการแปลงเป็นประเภท 8 บิตที่ไม่ได้ลงชื่อเพื่อบันทึกหน่วยความจำ
>>> s.astype(np.uint8)
0 1
1 2
2 249
dtype: uint8
การแปลงใช้งานได้ แต่ -7 ถูกพันเป็น 249 (เช่น 2 8 - 7)!
การพยายามดาวน์สตรีมโดยใช้pd.to_numeric(s, downcast='unsigned')
แทนที่จะช่วยป้องกันข้อผิดพลาดนี้ได้
3 infer_objects()
เวอร์ชัน 0.21.0 ของนุ่นนำเสนอวิธีการinfer_objects()
สำหรับการแปลงคอลัมน์ของ DataFrame ที่มีประเภทข้อมูลวัตถุเป็นประเภทที่เฉพาะเจาะจงมากขึ้น (การแปลงแบบนุ่ม)
ตัวอย่างเช่นนี่คือ DataFrame ที่มีสองคอลัมน์ประเภทวัตถุ หนึ่งเก็บจำนวนเต็มจริงและอื่น ๆ ถือสตริงแทนจำนวนเต็ม:
>>> df = pd.DataFrame({'a': [7, 1, 5], 'b': ['3','2','1']}, dtype='object')
>>> df.dtypes
a object
b object
dtype: object
ใช้infer_objects()
คุณสามารถเปลี่ยนประเภทของคอลัมน์ 'a' เป็น int64:
>>> df = df.infer_objects()
>>> df.dtypes
a int64
b object
dtype: object
คอลัมน์ 'b' ถูกทิ้งไว้ตามลำพังเนื่องจากค่าเป็นสตริงไม่ใช่จำนวนเต็ม หากคุณต้องการลองและบังคับให้การแปลงทั้งสองคอลัมน์เป็นประเภทจำนวนเต็มคุณสามารถใช้df.astype(int)
แทนได้