分類(Category)數據:直白來說,就是取值為有限的,或者說是固定數量的可能值。例如:性別、血型
指定數據類型構建分類數據
dtype="category"
以血型為例,創建一個關於血型的分類對象
import pandas as pd index = pd.Index(data=["Tom", "Bob", "Mary", "James", "Andy", "Alice"], name="name") user_info = pd.Series(data=["A", "AB", np.nan, "AB", "O", "B"], index=index, name="bloo d_type", dtype="category") user_info """ name Tom A Bob AB Mary NaN James AB Andy O Alice B Name: bloo d_type, dtype: category Categories (4, object): [A, AB, B, O] """
使用 pd.Categorical 來構建分類數據
import pandas as pd index = pd.Index(data=["Tom", "Bob", "Mary", "James", "Andy", "Alice"], name="name") user_info = pd.Series(data=["A", "AB", np.nan, "AB", "O", "B"], index=index, name="blood_type") # categories:自定義類別數據 pd.Categorical(user_info, categories=["A", "B", "AB"]) """ [A, AB, NaN, AB, NaN, B] Categories (3, object): [A, B, AB] """
轉為分類數據
我們經常遇到的情況是已經創建了一個 Series,如何將它轉為分類數據呢?來看看 astype 用法吧
user_info = pd.Series(data=["A", "AB", np.nan, "AB", "O", "B"], index=index, name="bloo d_type") user_info = user_info.astype("category") user_info """ name Tom A Bob AB Mary NaN James AB Andy O Alice B Name: bloo d_type, dtype: category Categories (4, object): [A, AB, B, O] """
常用操作
.describe()
可以對分類數據使用 .describe() 方法,得到的結果與 string 類型的數據相同
user_info.describe() """ count 5 unique 4 top AB freq 2 Name: bloo d_type, dtype: object """ """ count:非空的數據有5條 unique:去重后的非空數據有4條 top:出現次數最多的值為 AB freq:出現次數最多的值的次數為2次。 """
.cat.categories
使用 .cat.categories 來獲取分類數據所有可能的取值:
user_info.cat.categories """ Index(['A', 'AB', 'B', 'O'], dtype='object') """
.cat.rename_categories
使用 .cat.rename_categories 方法來重命名分類名稱
user_info.cat.rename_categories(["A+", "AB+", "B+", "O+"])
添加、刪除分類的操作,這些都可以通過 .cat.add_categories 、.cat.remove_categories 來實現。
.value_counts()
使用 value_counts 方法來查看數據分布的
user_info.value_counts()
.str 屬性
使用 .str 屬性來訪問分類數據
# 查看是否包含字母 "A user_info.str.contains("A")
pd.concat
使用 pd.concat 分類數據合並
blood_type1 = pd.Categorical(["A", "AB"])
blood_type2 = pd.Categorical(["B", "O"]) pd.concat([pd.Series(blood_type1), pd.Series(blood_type2)])
union_categoricals
分類數據經過 pd.concat 合並后類型轉為了 object 類型,如果想要保持分類類型的話,可以借助 union_categoricals 來完成。
from pandas.api.types import union_categoricals union_categoricals([blood_type1, blood_type2])
內存使用量
Categorical 的內存使用量是 與分類數乘以數據長度成正比
object 類型的數據 是一個 常數*數據的長度
在類別的數量很少的情況下,分類數據非常節省內存
blood_type = pd.Series(["AB","O"]*1000) blood_type.nbytes # 32000 blood_type.astype("category").nbytes # 4016
當類別的數量接近數據的長度,那么 Categorical 將使用與等效的 object 表示幾乎相同或更多的內存
blood_type = pd.Series(['AB%04d' % i for i in range(2000)]) blood_type.nbytes # 16000 blood_type.astype("category").nbytes # 20000