Task03:分类数据
分类数据类型在以下情况下非常有用 :
一个字符串变量,只包含几个不同的值。将这样的字符串变量转换为分类变量将会节省一些内存。
变量的词汇顺序与逻辑顺序(“one”,“two”,“three”)不同。 通过转换为分类并指定类别上的顺序,排序和最小/最大将使用逻辑顺序,而不是词法顺序。
作为其他python库的一个信号,这个列应该被当作一个分类变量(例如,使用合适的统计方法或plot类型)。
⼀、category的创建及其性质
1. 类变量的创建
1.1.1.⽤Series创建
In [1]: import pandas as pd
import numpy as np
df = pd.read_csv('c:data/.data.csv)#导入数据集
In [2]: pd.Series(["A, "B, "C, "A], dtype="category")
Out[2]: 0 A
1 B
2 C
3 A
dtype: category
Categories (3, object): [A, B, C]
1.1.2.对DataFrame定类型创建
In [3]: temp_df = pd.DataFrame({'A':pd.Series(["a", "b", "c", "a"], dtype="category"),'B':list('abc d')})
temp_df.dtypes
Out[3]: A category
B object
dtype: object
1.1.3.利用内置Categorical类型创建
In [4]: cat = pd.Categorical(["A", "B", "C", "A"], categories=['A','B','C'])
pd.Series(cat)
Out[4]: 0 A
1 B
2 C
3 A
dtype: category
Categories (3, object): [A, B, C]
1.1.4.利用cut函数创建(使用cut函数创建的类变量认为序类变量)
#当使用cut创建函数时默认使⽤区间类型为标签
In [5]: pd.cut(np.random.randint(0,60,5), [0,10,30,60])
Out[5]: [(10, 30], (0, 10], (10, 30], (30, 60], (30, 60]] Categories (3, interval[int64]): [(0, 10] < (10, 30] < (30, 60]]
#可指定字符为标签
In [6]: pd.cut(np.random.randint(0,60,5), [0,10,30,60], right=False, labels=['0-10','10-30','30-60' ])
Out[6]: [10-30, 30-60, 30-60, 10-30, 30-60] Categories (3, object): [0-10 < 10-30 < 30-60]
2. 分类变量的结构
⼀个类变量包括三个部分:元素值(values)、分类类别(categories)、是否有序(order)
1.2.1.describe方法
describe方法描述了⼀个类序列的情况,包括非缺失值个数,元素值类别数(不是分类类别数),最多次出现的元素及其频数
In [7]: s = pd.Series(pd.Categorical(["a", "b", "c", "a",np.nan],categories=['a','b','c','d']))
s.describe()
Out[7]: count 4
unique 3
top a
freq 2
dtype: object
1.2.2.categories和ordered属性(查看分类类别和是否排序)
In [8]: s.cat.categories
Out[8]: Index(['A', 'B', 'C', 'D'], dtype='object')
In [9]: s.cat.ordered
Out[9]: False
3.类别的修改
1.3.1.利用set_categories修改(修改分类,但本身值不会变)
In [10]: s = pd.Series(pd.Categorical(["a", "b", "c", "a",np.nan], categories=['a','b','c','d']))
s.cat.set_categories(['new_a','c'])
Out[10]: 0 NaN
1 NaN
2 c
3 NaN
4 NaN
dtype: category
Categories (2, object): [new_a, c]
1.3.2.利用rename_categories修改
注:该⽅法会把值和分类同时进行修改
In [11]: 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])
Out[11]: 0 new_a
1 new_b
2 new_c
3 new_a
4 NaN
dtype: category
Categories (4, object): [new_a, new_b, new_c, new_d]
1.3.3.利用add_categories添加
In [13]: s = pd.Series(pd.Categorical(["a", "b", "c", "a",np.nan], categories=['a','b','c','d']))
s.cat.add_categories(['e'])
Out[13]: 0 a
1 b
2 c
3 a
4 NaN
dtype: category
Categories (5, object): [a, b, c, d, e]
1.3.4.利用remove_categories移除
In [14]: s = pd.Series(pd.Categorical(["a", "b", "c", "a",np.nan], categories=['a','b','c','d']))
s.cat.remove_categories(['d'])
Out[14]: 0 a
1 b
2 c
3 a
4 NaN
dtype: category
Categories (3, object): [a, b, c]
1.3.5.删除元素值未出现的分类类型
In [15]: s = pd.Series(pd.Categorical(["a", "b", "c", "a",np.nan], categories=['a','b','c','d']))
s.cat.remove_unused_categories()
Out[15]: 0 a
1 b
2 c
3 a
4 NaN
dtype: category
Categories (3, object): [a, b, c]
二、分类变量的排序
1.序的建立
将一个序列转为有序变量,可利用as_ordered方法;退为无序变量只使用as_unordered方法。
In [16]: s = pd.Series(["a", "d", "c", "a"]).astype('category').cat.as_ordered()
s
Out[16]: 0 a
1 d
2 c
3 a
dtype: category
Categories (3, object): [a < c < d]
2.排序
排序中可以使用值排序和索引排序这里就不列出代码。
值排序:按照键(key)来提取出相应的值(value)
索引排序:索引数组s[i]存放的是a[i]数组的原先应该在的数组位置,相当于 a[i]=a[s[i]];从0—n-1开始遍历,如果索引值和当前位置不符合,就顺着索引链进行循环调整,直到找到等于当前下标值的索引位置为止,每一轮循环所涉及的记录都调整到位,其索引下标都改为所在位置的小比。