Pandas分類(category)數據處理


  分類(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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM