本文轉載自【微信公眾號:五角錢的程式設計師,ID:xianglin965】經微信公眾號授權轉載,如需轉載與原文作者聯繫
在拿到一份數據準備做挖掘建模之前,首先需要進行初步的數據探索性分析,對數據探索性分析之後要先進行一系列的數據預處理步驟。因為拿到的原始數據存在不完整、不一致、有異常的數據,而這些「錯誤」數據會嚴重影響到數據挖掘建模的執行效率甚至導致挖掘結果出現偏差,因此首先要數據清洗。數據清洗完成之後接著進行或者同時進行數據集成、轉換、歸一化等一系列處理,該過程就是數據預處理。一方面是提高數據的質量,另一方面可以讓數據更好的適應特定的挖掘模型,在實際工作中該部分的內容可能會佔整個工作的70%甚至更多。
文章目錄
第8章 分類數據一、category的創建及其性質1. 分類變量的創建2. 分類變量的結構(b)categories和ordered屬性3. 類別的修改二、分類變量的排序1. 序的建立2. 排序三、分類變量的比較操作1. 與標量或等長序列的比較2. 與另一分類變量的比較(b)不等式判別(包含>=,<=,<,>)兩個分類變量的不等式判別需要滿足兩個條件:① 分類完全相同 ② 排序完全相同
第8章 分類數據
import pandas as pdimport numpy as npdf = pd.read_csv('data/table.csv')df.head()
一、category的創建及其性質
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'])
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.categories
s.cat.ordered
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()
二、分類變量的排序
前面提到,分類數據類型被分為有序和無序,這非常好理解,例如分數區間的高低是有序變量,考試科目的類別一般看做無序變量
1. 序的建立
(a)一般來說會將一個序列轉為有序變量,可以利用as_ordered方法
s = pd.Series(["a", "d", "c", "a"]).astype('category').cat.as_ordered()s
退化為無序變量,只需要使用as_unordered
s.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. 排序
先前在第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()
三、分類變量的比較操作
1. 與標量或等長序列的比較
(a)標量比較
s = pd.Series(["a", "d", "c", "a"]).astype('category')s == 'a'
(b)等長序列比較
s == list('abcd')
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