pandas之分類操作
通常情況下,資料集中會存在許多同一類別的資訊,比如相同國家、相同行政編碼、相同性別等,當這些相同類別的資料多次出現時,就會給資料處理增添許多麻煩,導致資料集變得臃腫,不能直觀、清晰地展示資料。
針對上述問題,Pandas 提供了分類物件(Categorical Object),該物件能夠實現有序排列、自動去重的功能,但是它不能執行運算。本節,我們瞭解一下分類物件的使用。
物件建立
我們可以通過多種方式建立分類物件,下面介紹以下兩種方法:
1) 指定dtype建立
- import pandas as pd
- s = pd.Series(["a","b","c","a"], dtype="category")
- print(s)
輸出結果:
0 a 1 b 2 c 3 a dtype: category Categories (3, object): [a, b, c]
通過上述示例,您可能會注意到,雖然傳遞給 Series 四個元素值,但是它的類別為 3,這是因為 a 的類別存在重複。
2) pd.Categorical
通過 Category 的建構函式,您可以建立一個類別物件。建構函式,如下所示:
pandas.Categorical(values, categories, ordered)
values:以列表的形式傳參,表示要分類的值。
ordered:布林值,預設為 False,若為 Ture,表示對分類的資料進行排序。
dtype:返回一個 category 型別,表示分類物件。
示例如下:
- import pandas as pd
- #自動按a、b、c分類
- cat = pd.Categorical(['a', 'b', 'c', 'a', 'b', 'c'])
- print(cat)
輸出結果:
[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)
輸出結果:
[a, b, c, a, b, c, NaN] Categories (3, object): [c, b, a]
上述示例中,第二個引數值表示類別,當列表中不存在某一類別時,會自動將類別值設定為 NA。
通過指定ordered=True
來實現有序分類。示例如下:
- import pandas as pd
- cat=pd.Categorical(['a','b','c','a','b','c','d'], ['c', 'b', 'a'],ordered=True)
- print(cat)
- #求最小值
- print(cat.min())
輸出結果:
[a, b, c, a, b, c, NaN] Categories (3, object): [c < b < a] c
獲取統計資訊
對已經分類的資料使用 describe() 方法,您會得到和資料統計相關的摘要資訊。
- 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())
輸出結果:
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)
輸出結果:
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)
輸出結果:
False
重新命名類別
要想對類別實現重新命名,可以通過 Series.cat.categories 來實現的,示例如下:
- 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)
輸出結果:
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])
- #檢視現有類別
- print(s.cat.categories)
輸出結果:
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"))
輸出結果
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]
分類物件比較
在下述兩種情況下,我們可以對分類物件進行比較:
- 當兩個類別物件長度相同時,可以進行比較運算;
- 當兩個類別的ordered 均等於True,並且類別相同時,可以進行比較運算,比如 ==,!=,>,>=,< 和 <=。
示例如下:
- import pandas as pd
- s1=['a','a','b','d','c']
- #當滿足兩個類別長度相同時
- ss0=pd.Categorical(s1,categories=['a','d','b','c'])
- ss1 = pd.Categorical(s1)
- print(ss0==ss1)
輸出結果:
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)
輸出結果:
array([False, True, False, False, False])