第十二章 高阶pandas
12.1 分类数据
12.1.1 背景和目标
1.pandas中unique和value_counts函数
一个列经常会包含重复值,这些重复值是一个小型的不同值的集合。
看见向unique和value_counts这样的函数,它们允许我们从一个数组中提取不同值并分别计算这些不同值的频率。(见图12-1)

2.维度表的使用
许多数据系统(用于数据入库、统计计算或其他用途)已经开发出专门的方法,用重复的值来表示数据,以便更有效地存储和计算。
在数据入库的操作中,使用所谓的维度表是一种最佳实践,维度表包含了不同值,并将主要观测值存储为引用维度表的整数键。(见图12-2)

注:这种按照整数展现的方式被称为分类或字典编码展现。不同值的数组可以被称为数据的类别、字典或层级。
做数据分析时,分类展示会产生显著的性能提升。你也可以在类别上进行转换同时不改变代码。以下是一些相对低开销的转换示例:
· 重命名类别
· 在不改变已有的类别顺序的情况下添加一个新的类别
12.1.2 pandas中的Categorical类型
pandas拥有特殊的Categorical类型,用于承载基于整数的类别展示或编码的数据。
Series 示例(见图12-3)

1.调用函数astype将Python字符串对象组成的数组df['fruit']转换为Categorical对象(见图12-4)

2.Categorical对象的category和codes属性(见图12-5)

3.通过分配已转换的结果将DataFrame的一列转换为Categorical对象(见图12-6)

4.从其他Python序列类型直接生成pandas.Categorical(见图12-7)

5.从另一个数据源获得了分类编码数据,可以使用from_codes构造函数(见图12-8)

6.为类别指定顺序以及使用as_ordered排序(见图12-9)

注:一个分类数组可以包含任一不可变的值类型。
12.1.3 使用Categorical对象进行计算
pandas中使用Categorical与非编码版本相比(例如字符串数组)整体上是一致的。pandas中的某些部分,比如groupby函数,在与Categorical对象协同工作时性能更好。还有一些函数可以利用ordered标识。
1.使用pandas.qcut分箱函数,结果会返回pandas. Categorical。(见图12-10)

注:虽然样本的四分位数有用,但是在生成一份报告时,四分位数就没有四分位数名称有用了,通过在qcut函数中使用labels参数来实现这个功能。
2.使用groupby来提取一些汇总统计值(见图12-11)
被标记的bins分类数据并不包含数据中箱体边界的相关信息

12.1.3.1 使用分类获得更高性能
如果你在特定的数据集上做了大量的分析,将数据转换为分类数据可以产生大幅的性能提升。DateFrame中一列的分类版本通常也会明显使用更少内存(见图12-12)

注:使用分类对象进行GroupBy操作明显更快,这是因为底层算法使用了基于整数代码的数组而不是字符串数组。
12.1.4 分类方法
Series包含的分类数据拥有一些特殊方法,这些方法类似于Series.str的特殊字符串方法。这些方法提供了快捷访问类别和代码的方式。
1.特殊属性cat提供了对分类方法的访问(见图12-13)

2.set_categories方法
当知道该数据的实际类别集合超出了数据中观察到的四个值。我们可以使用set_categories方法来改变类别。(见图12-14)

3.使用remove_unused_categories方法来去除未观察到的类别
在大型数据集中,分类数据经常被用于节省内存和更高性能的便捷工具。在你过滤了一个大型DataFrame或Series之后,很多类别将不会出现在数据中。为了帮助解决这个问题,我们可以使用remove_unused_categories方法来去除未观察到的类别。(见图12-15)

附:分类方法列表(见表12-1)

12.1.4.1 创建用于建模的虚拟变量
当你使用统计数据或机器学习工具时,通常会将分类数据转换为虚拟变量,也称为one-hot编码。这会产生一个DataFrame,每个不同的类别都是它的一列。这些列包含一个特定类别的出现次数,否则为0。
pandas.get_dummies函数将一维的分类数据转换为一个包含虚拟变量的DataFrame。(见图12-16)

网友评论