【Python基础】学习用Pandas处理分类数据!
分類數據(categorical data)是按照現象的某種屬性對其進行分類或分組而得到的反映事物類型的數據,又稱定類數據。直白來說,就是取值為有限的,或者說是固定數量的可能值。例如:性別、血型等。
今天,我們來學習下,Pandas如何處理分類數據。主要圍繞以下幾個方面展開:
本文目錄
????1.?Category的創建及其性質
????????1.1.?分類變量的創建
??????? 1.2. 分類變量的結構
? ? ? ? 1.3.?類別的修改
????2. 分類變量的排序
????????2.1. 序的建立
????????2.2.?排序
????3. 分類變量的比較操作
????????3.1. 與標量或等長序列的比較
????????3.2. 與另一分類變量的比較
????4.?問題及練習
????????4.1. 問題
????????4.2. 練習
首先,讀入數據:
一、category的創建及其性質
1.1.?分類變量的創建
(a)用Series創建
pd.Series(["a", "b", "c", "a"], dtype="category")(b)對DataFrame指定類型創建
temp_df = pd.DataFrame({'A':pd.Series(["a", "b", "c", "a"], dtype="category"),'B':list('abcd')}) temp_df.dtypes(c)利用內置Categorical類型創建
cat = pd.Categorical(["a", "b", "c", "a"], categories=['a','b','c']) pd.Series(cat)(d)利用cut函數創建,默認使用區間類型為標簽
pd.cut(np.random.randint(0,60,5), [0,10,30,60])可指定字符為標簽
pd.cut(np.random.randint(0,60,5), [0,10,30,60], right=False, labels=['0-10','10-30','30-60'])
1.2. 分類變量的結構
一個分類變量包括三個部分,元素值(values)、分類類別(categories)、是否有序(order)。從上面可以看出,使用cut函數創建的分類變量默認為有序分類變量。下面介紹如何獲取或修改這些屬性。
(a)describe方法
該方法描述了一個分類序列的情況,包括非缺失值個數、元素值類別數(不是分類類別數)、最多次出現的元素及其頻數。
s = pd.Series(pd.Categorical(["a", "b", "c", "a",np.nan], categories=['a','b','c','d'])) s.describe()(b)categories和ordered屬性,查看分類類別和是否排序
s.cat.categoriesIndex(['a', 'b', 'c', 'd'], dtype='object')
s.cat.ordered False1.3. 類別的修改
(a)利用set_categories修改,修改分類,但本身值不會變化
s = pd.Series(pd.Categorical(["a", "b", "c", "a",np.nan], categories=['a','b','c','d'])) s.cat.set_categories(['new_a','c'])(b)利用rename_categories修改,需要注意的是該方法會把值和分類同時修改
s = pd.Series(pd.Categorical(["a", "b", "c", "a",np.nan], categories=['a','b','c','d'])) s.cat.rename_categories(['new_%s'%i for i in s.cat.categories])利用字典修改值
s.cat.rename_categories({'a':'new_a','b':'new_b'})(c)利用add_categories添加
s = pd.Series(pd.Categorical(["a", "b", "c", "a",np.nan], categories=['a','b','c','d'])) s.cat.add_categories(['e'])(d)利用remove_categories移除
s = pd.Series(pd.Categorical(["a", "b", "c", "a",np.nan], categories=['a','b','c','d'])) s.cat.remove_categories(['d'])(e)刪除元素值未出現的分類類型
s = pd.Series(pd.Categorical(["a", "b", "c", "a",np.nan], categories=['a','b','c','d'])) s.cat.remove_unused_categories()二、分類變量的排序
前面提到,分類數據類型被分為有序和無序,這非常好理解,例如分數區間的高低是有序變量,考試科目的類別一般看做無序變量
2.1.?序的建立
(a)一般來說會將一個序列轉為有序變量,可以利用as_ordered方法
s = pd.Series(["a", "d", "c", "a"]).astype('category').cat.as_ordered() s 退化為無序變量,只需要使用as_unordereds.cat.as_unordered()(b)利用set_categories方法中的order參數
pd.Series(["a", "d", "c", "a"]).astype('category').cat.set_categories(['a','c','d'],ordered=True)(c)利用reorder_categories方法,這個方法的特點在于,新設置的分類必須與原分類為同一集合
s = pd.Series(["a", "d", "c", "a"]).astype('category') s.cat.reorder_categories(['a','c','d'],ordered=True) #s.cat.reorder_categories(['a','c'],ordered=True) #報錯 #s.cat.reorder_categories(['a','c','d','e'],ordered=True) #報錯2.2. 排序
先前在第1章介紹的值排序和索引排序都是適用的
s = pd.Series(np.random.choice(['perfect','good','fair','bad','awful'],50)).astype('category') s.cat.set_categories(['perfect','good','fair','bad','awful'][::-1],ordered=True).head() s.sort_values(ascending=False).head() df_sort = pd.DataFrame({'cat':s.values,'value':np.random.randn(50)}).set_index('cat') df_sort.head() df_sort.sort_index().head()三、分類變量的比較操作
3.1. 與標量或等長序列的比較
(a)標量比較
s = pd.Series(["a", "d", "c", "a"]).astype('category') s == 'a'(b)等長序列比較
s == list('abcd')3.2.?與另一分類變量的比較
(a)等式判別(包含等號和不等號),兩個分類變量的等式判別需要滿足分類完全相同。
s = pd.Series(["a", "d", "c", "a"]).astype('category') s == s s != s s_new = s.cat.set_categories(['a','d','e']) #s == s_new #報錯(b)不等式判別(包含>=,<=,<,>),兩個分類變量的不等式判別需要滿足兩個條件:① 分類完全相同 ② 排序完全相同
s = pd.Series(["a", "d", "c", "a"]).astype('category') #s >= s #報錯 s = pd.Series(["a", "d", "c", "a"]).astype('category').cat.reorder_categories(['a','c','d'],ordered=True) s >= s四、問題與練習
4.1. 問題
【問題一】 如何使用union_categoricals方法?它的作用是什么?
如果要組合不一定具有相同類別的類別,union_categoricals函數將組合類似列表的類別。新類別將是合并的類別的并集。如下所示:
默認情況下,生成的類別將按照在數據中顯示的順序排列。如果要對類別進行排序,可使用sort_categories=True參數。
union_categoricals也適用于組合相同類別和順序信息的兩個分類。
union_categoricals可以在合并分類時重新編碼類別的整數代碼。
【問題二】 利用concat方法將兩個序列縱向拼接,它的結果一定是分類變量嗎?什么情況下不是?
【問題三】 當使用groupby方法或者value_counts方法時,分類變量的統計結果和普通變量有什么區別?
分類變量的groupby方法/value_counts方法,統計對象是類別。
普通變量groupby方法/value_counts方法,統計對象是唯一值(不包含NA)。
【問題四】 下面的代碼說明了Series創建分類變量的什么“缺陷”?如何避免?(提示:使用Series中的copy參數)
cat = pd.Categorical([1, 2, 3, 10], categories=[1, 2, 3, 4, 10]) s = pd.Series(cat, name="cat") cat s.iloc[0:2] = 10 cat 4.2. 練習【練習一】 現繼續使用第四章中的地震數據集,請解決以下問題:
(a)現在將深度分為七個等級:[0,5,10,15,20,30,50,np.inf],請以深度等級Ⅰ,Ⅱ,Ⅲ,Ⅳ,Ⅴ,Ⅵ,Ⅶ為索引并按照由淺到深的順序進行排序。
使用cut方法對列表中的深度劃分,并將該列作為索引值。然后按索引排序即可。
(b)在(a)的基礎上,將烈度分為4個等級:[0,3,4,5,np.inf],依次對南部地區的深度和烈度等級建立多級索引排序。
跟(a)很相似,cut方法對深度,烈度進行切分,把index設為[‘深度’,‘烈度’],然后進行索引排序即可。
【練習二】 對于分類變量而言,調用第4章中的變形函數會出現一個BUG(目前的版本下還未修復):例如對于crosstab函數,按照官方文檔的說法,即使沒有出現的變量也會在變形后的匯總結果中出現,但事實上并不是這樣,比如下面的例子就缺少了原本應該出現的行'c'和列'f'。基于這一問題,請嘗試設計my_crosstab函數,在功能上能夠返回正確的結果。
因為Categories中肯定包含出現的變量。所以將第一個參數作為index,第二個參數作為columns,建立一個DataFrame,然后把出現的變量組合起來,對應位置填入1即可。
總結
以上是生活随笔為你收集整理的【Python基础】学习用Pandas处理分类数据!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【推荐系统】推荐系统主流召回方法综述
- 下一篇: 太赞了!开源下载机器学习经典书 PRML