专栏首页数据科学学习手札(数据科学学习手札68)pandas中的categorical类型及应用

(数据科学学习手札68)pandas中的categorical类型及应用

一、简介

  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')

  关于pandas中的categorical型数据还有很多的小技巧,因为不常用这里就不再赘述,感兴趣可以查看pandas的官方文档,以上就是本文的全部内容,如有笔误望指出!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python基础入门_2基础语法和变量类型

    Python 基础入门系列第二篇,上一篇简单介绍了为什么用 Python,以及安装和配置环境。

    材ccc
  • Python-100 练习题 03 完全平方数

    http://www.runoob.com/python/python-exercise-example3.html

    材ccc
  • 机器学习如何为业务赋能?

    Python 是一种胶水语言,可以粘很多家伙,例如:Python + 网站开发、Python + 自动化测试、Python + 自动化运维、Python + A...

    一猿小讲
  • Python基础入门_3条件语句和迭代循环

    Python 的条件语句就是通过一条或者多条语句的执行结果(判断 True 或者 False)来决定执行的代码块。

    材ccc
  • Python 基础入门--简介和环境配置

    上周结束了如何构造一个机器学习项目的系列文章,当然还有一篇简单的总结以及介绍一些入门的学习资料,不过还在整理,应该这周内会整理好的。

    材ccc
  • itchat 保存好友信息以及生成好友头像图片墙

    运行这段代码后,就会弹出一个二维码,进行扫描登录,其中 hotReload=True 是保证不用每次运行程序都需要弹出二维码扫描登录。

    材ccc
  • 初学者的机器学习入门实战教程!

    这是一篇手把手教你使用 Python 实现机器学习算法,并在数值型数据和图像数据集上运行模型的入门教程,当你看完本文后,你应当可以开始你的机器学习之旅了!

    材ccc
  • Python-100例(7-8) 复制列表 & 打印乘法口诀

    这次是分享 Python-100 例的第 7-8 题,分别是复制列表和打印乘法口诀,这两道题目都比较简单。

    材ccc
  • [实战]制作简单的公众号二维码关注图

    最近刚刚更换了公众号名字,然后自然就需要更换下文章末尾的二维码关注图,但是之前是通过 windows 自带的画图软件做的,但是之前弄的时候其实还是比较麻烦的,所...

    材ccc
  • 我珍藏的一些好的Python代码,技巧

    最近后台关注的粉丝越来越多,大部分其实还是偏入门和基础!很多小伙伴加了菜鸟学Python小助手的微信,有一些在问一些入门的问题,有一些在问如何学习Python.

    材ccc

扫码关注云+社区

领取腾讯云代金券