pandas 中的 Category 详解

    关于 pandas 的 Categorical 类型的数据,官方文档是这样描述的:

    Categoricals 是 pandas 的一种数据类型,对应着被统计的变量。Categoricals 是由固定的且有限数量的变量组成的。比如:性别、社会阶层、血型、国籍、观察时段、赞美程度等等。
    
    与其它被统计的变量相比,categorical 类型的数据可以具有特定的顺序——比如:按程度来设定,“强烈同意”与“同意”,“首次观察”与“二次观察”,但是不能做按数值来进行排序操作(比如:sort_by 之类的,换句话说,categorical 的顺序是创建时手工设定的,是静态的)
    
    类型数据的每一个元素的值要么是预设好的类型中的某一个,要么是空值(np.nan)。顺序是由预设好的类型集合来决定的,而不是按照类型集合中各个元素的字母顺序排序的。categorical 实例的内部是由类型名字集合和一个整数组成的数组构成的,后者标明了类型集合真正的值。

对 Categorical 数据的一个直观认识

隐式创建 Categorical 数据

    用一段代码从不同角度来展现一下 categorical 类型的数据。

# 先创建一个简单的 DataFrame 实例 # Terry, Hardon, Curry, Duran, James 和 Barter 代表东西部玩三打三 # 用一组数据记录各自的得分情况 import pandas as pd, numpy as np players=['Garsol','Hardon','Bill','Duran','James','Barter'] scores=[22,34,12,31,26,19] teams=['West','West','East','West','East','East'] df=pd.DataFrame({'player':players,'score':scores,'team':teams}) df
输出:
   player  score  team 0  Garsol     22  West 1  Hardon     34  West 2    Bill     12  East 3   Duran     31  West 4   James     26  East 5  Barter     19  East

    可以看出 team 这一列,其实只有两种值:East 和 West,可以将 team 列的类型设定为 category
    
    df.team.astype('category')
    
0    West 1    West 2    East 3    West 4    East 5    East Name: team, dtype: category Categories (2, object): [East, West]
    可以看到,df.team 的变量类型变成了 category。

显式创建 Categorical 数据

    cg=pd.Categorical(['Role','Role','Star','Role','Killer','Star'],categories=['Role', 'Star'])
    cg
[Role, Role, Star, Role, NaN, Star] Categories (2, object): [Role, Star]

    可以看到,构造方法中第二个参数是指定了实例中可以包含的元素,在第一个参数中的元素如果不在 categories 中,就会被转成NaN。
    
    使用pandas的类别相关的方法可以设置和改变数据的类别。

import pandas as pd import numpy as np df = pd.DataFrame({"id":[1,2,3,4,5,6], "raw_grade":['a', 'b', 'b', 'a', 'a', 'e']}) #将raw_grade列转化为category类型 df["grade"] = df["raw_grade"].astype("category") print(df["grade"])
 
    可以看到此时类标签的字符a,b,e ;类标签的集合为[a,b,e],打印类标签的结果如下:
    #改变类别标签
    df["grade"].cat.categories = ["very good", "good", "very bad"]
    print(df["grade"])
    
 
    给categories赋值,可以改变类别标签。赋值的时候是按照顺序进行对应的。a对应very good,b对应good,c对应very bad。操作完成之后,原来的标签a就变成了very good标签。 
    此时类标签的集合为[“very good”, “good”, “very bad”]

#改变类别标签集合,注意和上面的对.categories的操作进行区分。 df["grade"] = df["grade"].cat.set_categories(["very bad", "bad", "medium", "good", "very good"]) print(df["grade"])
    
    改变类别标签集合,操作过后数据的标签不变,但是标签的集合变为[“very bad”, “bad”, “medium”, “good”, “very good”]

    #按照类标签在标签集中的顺序排序,而不是安装类标签的字母顺序进行排序
    dfnew = df.sort_values(by="grade")
    print(dfnew)
这里写图片描述
    #根据类标签进行分组
    df.groupby("grade").size()
这里写图片描述

大数据分析实战 发表于 2018-03-13 17:46:03