一, 简介
categorical 是 pandas 中对应分类变量的一种数据类型, 与 R 中的因子型变量比较相似, 例如性别, 血型等等用于表征类别的变量都可以用其来表示, 本文就将针对 categorical 的相关内容及应用进行介绍.
二, 创建与应用
2.1 基本特性和适用场景
在介绍具体方法之前, 我们需要对 pandas 数据类型中的 categorical 类型有一个了解, categorical 类似 R 中的因子型变量, 可以进行排序操作, 但不可以进行数值运算操作, 其顺序在其被定义的时候一同确定, 而不是按照数字字母词法排序的顺序, 其适用场景有如下几个:
1, 具有少数几种可能取值并存在大量重复的字符串字段, 利用 categorical 类型对其转换后可有效节省内存
2, 字段的排序规则特殊, 不遵循词法顺序时, 可以利用 categorical 类型对其转换后得到用户所需的排序规则,
2.2 创建方式
pandas 中创建 categorical 型数据主要有如下几种方式:
1, 对于 Series 数据结构, 传入参数 dtype='category'即可:
- # 直接创建 categorical 型 Series
- series_cat = pd.Series(['B','D','C','A'], dtype='category')
- # 显示 Series 信息
- series_cat
可以看到, series_cat 的类型为 category, 但是没有声明顺序, 这时若对 Series 排序, 实际上还是按照词法的顺序:
series_cat.sort_values()
2, 对于 DataFrame, 在定义数据之后转换类型:
- # 创建数据框
- df_cat = pd.DataFrame({
- 'V1':['A','C','B','D']
- })
- # 转换指定列的数据类型为 category
- df_cat['V1'] = df_cat['V1'].astype('category')
- df_cat['V1']
3, 利用 pd.Categorical()生成类别型数据后转换为 Series, 或替换 DataFrame 中的内容:
- categorical_ = pd.Categorical(['A','B','D','C'],
- categories=['A','B','C','D'])
- series_cat = pd.Series(categorical_)
- series_cat
- categorical_ = pd.Categorical(['A','B','D','C'],
- categories=['A','B','C','D'])
- df_cat = pd.DataFrame({
- 'V1':categorical_
- })
- df_cat['V1']
而 pd.Categorical()独立创建 categorical 数据时有两个新的特性, 一是其通过参数 categories 定义类别时, 若原数据中出现了 categories 参数中没有的数据, 则会自动转换为 pd.nan:
- categorical_ = pd.Categorical(['A','B','D','C'],
- categories=['B','C','D'])
- df_cat = pd.DataFrame({
- 'V1':categorical_
- })
- df_cat['V1']
另外 pd.Categorical()还有一个 bool 型参数 ordered, 设置为 True 时则会按照 categories 中的顺序定义从小到大的范围:
- categorical_ = pd.Categorical(['A','B','D','C'],
- categories=['A','B','C','D'],
- ordered=True)
- df_cat = pd.DataFrame({
- 'V1':categorical_
- })
- df_cat['V1']
4, 利用 pandas.API.types 中的 CategoricalDtype()对已有数据进行转换
通过 CategoricalDtype(), 我们可以结合 astype()完成从其他类型数据向 categorical 数据的转换过程, 利用 CategoricalDtype()的参数 categories,ordered, 弥补. astype('category')的短板 (实际上. astype('category') 等价于. astype(CategoricalDtype(categories=None, ordered=False))):
- from pandas.API.types import CategoricalDtype
- # 创建数据框
- df_cat = pd.DataFrame({
- 'V1':['A','C','B','D']
- })
- cat = CategoricalDtype(categories=['A','C','B'],
- ordered=True)
- df_cat['V1'] = df_cat['V1'].astype(cat)
- df_cat['V1']
2.3 应用
categorical 型数据主要应用于自定义排序, 如下例, 我们创建了一个包含字符型变量 class 和数值型变量 value 的数据框:
- import numpy as np
- df = pd.DataFrame({
- 'class':np.random.choice(['A','B','C','D'],10),
- 'value':np.random.uniform(0,10,10)
- })
- df.head()
如果按照 class 列排序得到的结果是按照字母自然顺序:
df.sort_values('class')
而通过将 class 列修改为自己定义的排序方式则得到的结果如下:
- from pandas.API.types import CategoricalDtype
- cat = CategoricalDtype(categories=['B','D','A','C'],
- ordered=True)
- df['class'] = df['class'].astype(cat)
- df.sort_values('class')
若想要临时修改排序规则, 可以使用. cat.reorder_categories()方法:
- df['class'].cat.reorder_categories(['D','B','C','A'],
- ordered=True,
- inplace=True)#iinplace 参数设置为 True 使得变动覆盖原数据
- df.sort_values('class')
来源: https://www.cnblogs.com/feffery/p/11436158.html