分类数据的创建及排序

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开始遍历,如果索引值和当前位置不符合,就顺着索引链进行循环调整,直到找到等于当前下标值的索引位置为止,每一轮循环所涉及的记录都调整到位,其索引下标都改为所在位置的小比。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值