pandas

RolandHe發表於2024-10-19

DataFrame類的dtype介紹如下:
object: 定義該列值可以存放任意型別的內容,比如float64, str, int32等等。從excel讀入時,空值將以float64形式儲存為np.NaN。
float64: 即浮點形,為numpy的浮點形,而不是python內建型別的float,在numpy中執行時相較於float有效能優勢,空值儲存為np.NaN
pd.StringDtype(): pandas的內建字串型別,空值為pd.NA。顯示定義這個型別的列後,列中所有值都將是str,而不像object,會將某個值推斷為非str型別。

列定義為dtype=object時,該列中每行的值的實際儲存型別可以有多處。 但列定義為float64或int32時,所有值必須都是符合該定義型別的數值,或np.NaN(一般從excel讀入空值時便是np.NaN)。
列定義為dtype=np.float64時,必須確保每個值要麼是空,要麼是能轉為數值的字串。整個列型別為numpy.float64
列定義為dtype=str時,所有值都會實際以str儲存,但整個列的型別仍然為object,既後續可能追加非str型別的值。
列定義為dtype=pd.StringDtype()是,所有值都會實際以str儲存,但整個列的型別為string[python],既後續追加的新值必須也是str。

當使用類似df_object['cola'].str.contains('abc', na=False)) 這樣的函式時,一定要確保該列都為str的值,否則,遇到推斷為非str值時,就會報錯。所以建議如果要在某列上使用這種函式,應該顯示指定dtype=str或pd.StringDtype()。

舉列

import pandas as pd
import numpy as np

df_object = pd.DataFrame({"cola": [33,34.1,35,36]}, dtype=object)  # 列型別為object
type(df_object['cola'][0])  # 輸出結果為 int
df_object['cola'][0] # 輸出結果為 33
type(df_object['cola'][1])  # 輸出結果為 float (注意,這裡該值型別為float, 而不是numpy.float64)
df_object['cola'][1] # 輸出結果為 34.1

df_float = pd.DataFrame({"cola": [33,34.1,35,36]}, dtype=np.float64)  # 列型別為float64
type(df_float ['cola'][1])  # 輸出結果為 numpy.float64
df_float['cola'][1] # 輸出結果為 34.1

df_str = pd.DataFrame({"cola": [33,34,35,36]}, dtype=str)  # 列型別仍然為object
type(df_str['cola'][1])  # 輸出結果為 str
df_str['cola'][1] # 輸出結果為 '34.1'

df_pdstr = pd.DataFrame({"cola": [33,34,35,36]}, dtype=pd.StringDtype())  # 列型別為string[python]
type(df_pdstr['cola'][1])  # 輸出結果為 str
df_pdstr['cola'][1] # 輸出結果為 '34.1'

相關文章