通常情況下,數(shù)據(jù)集中會存在許多同一類別的信息,比如相同國家、相同行政編碼、相同性別等,當(dāng)這些相同類別的數(shù)據(jù)多次出現(xiàn)時,就會給數(shù)據(jù)處理增添許多麻煩,導(dǎo)致數(shù)據(jù)集變得臃腫,不能直觀、清晰地展示數(shù)據(jù)。
針對上述問題,Pandas 提供了分類對象(Categorical Object),該對象能夠?qū)崿F(xiàn)有序排列、自動去重的功能,但是它不能執(zhí)行運算。本節(jié),我們了解一下分類對象的使用。
我們可以通過多種方式創(chuàng)建分類對象,下面介紹以下兩種方法:
- import pandas as pd
- s = pd.Series(["a","b","c","a"], dtype="category")
- print(s)
輸出結(jié)果:
0 a 1 b 2 c 3 a dtype: category Categories (3, object): [a, b, c]
通過上述示例,您可能會注意到,雖然傳遞給 Series 四個元素值,但是它的類別為 3,這是因為 a 的類別存在重復(fù)。
通過 Category 的構(gòu)造函數(shù),您可以創(chuàng)建一個類別對象。構(gòu)造函數(shù),如下所示:
pandas.Categorical(values, categories, ordered)
示例如下:
- import pandas as pd
- #自動按a、b、c分類
- cat = pd.Categorical(['a', 'b', 'c', 'a', 'b', 'c'])
- print(cat)
輸出結(jié)果:
[a, b, c, a, b, c] Categories (3, object): [a, b, c]
再看一組示例:
- import pandas as pd
- cat=pd.Categorical(['a','b','c','a','b','c','d'], ['c', 'b', 'a'])
- print(cat)
輸出結(jié)果:
[a, b, c, a, b, c, NaN] Categories (3, object): [c, b, a]
上述示例中,第二個參數(shù)值表示類別,當(dāng)列表中不存在某一類別時,會自動將類別值設(shè)置為 NA。
通過指定ordered=True來實現(xiàn)有序分類。示例如下:
- import pandas as pd
- cat=pd.Categorical(['a','b','c','a','b','c','d'], ['c', 'b', 'a'],ordered=True)
- print(cat)
- #求最小值
- print(cat.min())
輸出結(jié)果:
[a, b, c, a, b, c, NaN] Categories (3, object): [c < b < a] c
對已經(jīng)分類的數(shù)據(jù)使用 describe() 方法,您會得到和數(shù)據(jù)統(tǒng)計相關(guān)的摘要信息。
- import pandas as pd
- import numpy as np
- cat = pd.Categorical(["a", "c", "c", np.nan], categories=["b", "a", "c"])
- df = pd.DataFrame({"cat":cat, "s":["a", "c", "c", np.nan]})
- print(df.describe())
- print(df["cat"].describe())
輸出結(jié)果:
cat s count 3 3 unique 2 2 top c c freq 2 2 count 3 unique 2 top c freq 2 Name: cat, dtype: object
使用obj.categories命令可以獲取對象的類別信息。示例如下:
import pandas as pd
import numpy as np
s = pd.Categorical(["a", "c", "c", np.nan], categories=["b", "a", "c"])
print (s.categories)
輸出結(jié)果:
Index(['b', 'a', 'c'], dtype='object')
通過 obj.order 可以獲取 order 指定的布爾值:
import pandas as pd
import numpy as np
cat = pd.Categorical(["a", "c", "c", np.nan], categories=["b", "a", "c"])
#False表示未指定排序
print (cat.ordered)
輸出結(jié)果:
False
要想對類別實現(xiàn)重命名,可以通過 Series.cat.categories 來實現(xiàn)的,示例如下:
import pandas as pd
s = pd.Series(["a","b","c","a"], dtype="category")
#對類名重命名
s.cat.categories = ["Group %s" % g for g in s.cat.categories]
print(s.cat.categories)
輸出結(jié)果:
Index(['Group a', 'Group b', 'Group c'], dtype='object')
使用 s.cat.add_categories() 方法,可以追加新類別。
import pandas as pd
s = pd.Series(["a","b","c","a"], dtype="category")
#追加新類別
s = s.cat.add_categories([5])
#查看現(xiàn)有類別
print(s.cat.categories)
輸出結(jié)果:
Index(['a', 'b', 'c', 5], dtype='object')
使用 remove_categories() 方法,可以刪除不需要的類別。示例如下:
import pandas as pd
s = pd.Series(["a","b","c","a"], dtype="category")
#原序列
print(s)
#刪除后序列
print(s.cat.remove_categories("a"))
輸出結(jié)果
0 a 1 b 2 c 3 a dtype: category Categories (3, object): [a, b, c] 0 NaN 1 b 2 c 3 NaN dtype: category Categories (2, object): [b, c]
在下述兩種情況下,我們可以對分類對象進行比較:
示例如下:
import pandas as pd
s1=['a','a','b','d','c']
#當(dāng)滿足兩個類別長度相同時
ss0=pd.Categorical(s1,categories=['a','d','b','c'])
ss1 = pd.Categorical(s1)
print(ss0==ss1)
輸出結(jié)果:
array([ True, True, True, True, True])
示例如下:
import pandas as pd
s1=['a','a','b','d','c']
s2=['a','b','b','d','c']
#滿足上述第二個條件,類別相同,并且ordered均為True
ss0=pd.Categorical(s1,categories=['a','d','b','c'],ordered=True)
ss1 = pd.Categorical(s2,categories=['a','d','b','c'],ordered=True)
print(ss0<ss1)
輸出結(jié)果:
array([False, True, False, False, False])
更多建議: