Pandas的Categorical Data类型
pandas从0.15版开始提供分类数据类型,用于表示统计学里有限且唯一性数据集,例如描述个人信息的性别一般就男和女两个数据常用'm'和'f'来描述,有时也能对应编码映射为0和1。血型A、B、O和AB型等选择可以映射为0、1、2、3这四个数字分别代表各个血型。pandas里直接就有categorical类型,可以有效地对数据进行分组进行相应的汇总统计工作。
当DataFrame的某列(字段)上的数据值是都是某有限个数值的集合里的值的时候,例如:性别就男和女,有限且唯一。这列可以采用Categorical Data类型来存储、统计。
pandas的Categorical Data类型灵感来源于Data wareHorsing数据仓库里的维度表设计理念,即某列数据存储的不是数据本身,而是该数据对应的编码(有称为分类、字典编码) 这些编码比数据本身存储依赖的空间小,但能基于编码统计汇总的速度要比数据本身的存储、统计速度要快。
1 如何理解Categorical Data?
下面看一张某水果超市的供货商表(表1):
供货商 | 水果 | 价格 |
---|---|---|
1 | apple | 5.20 |
2 | pearl | 3.50 |
3 | orange | 7.30 |
5 | apple | 5.00 |
6 | orange | 7.50 |
7 | orange | 7.30 |
9 | apple | 5.20 |
4 | pearl | 3.70 |
8 | orange | 7.30 |
第2列是各个水果供应商的能供应的水果类型,目前市场也就apple、pearl、orange
三种水果可以买到,对于一个大超市而言可能这个表很长、有很多的水果供应商,假设有1亿条数据,那么数据存储所需空间主要浪费在水果名字上了,其他字段都是数值型的数据,而水果这一列是字符串型的,很占空间,如何能降低这张大表的存储空间浪费呢? 设计一个辅助的水果编码表(表2):
编码 | 水果 |
---|---|
0 | apple |
1 | pearl |
2 | orange |
那么供应商的表就变为(表3):
供货商 | 水果 | 价格 |
---|---|---|
1 | 0 | 5.20 |
2 | 1 | 3.50 |
3 | 2 | 7.30 |
5 | 0 | 5.00 |
6 | 2 | 7.50 |
7 | 2 | 7.30 |
9 | 0 | 5.20 |
4 | 1 | 3.70 |
8 | 2 | 7.30 |
变化后的表的数据存储所需的空间量就下来了。也就是说在供应商表里存储的不是水果名数据本身而是存储的水果对应的编码值(通常用整形数据)。可以查供应商表里水果的编码再查辅助的编码表找到水果名。这个水果的编码表在数据仓库里称为维度表(dimension tables)。 而pandas的categorical data的作用就是构建并依赖这个维度表,即例子里的水果编码表。pandas里维度表里记录着若干且唯一的几个分类,可以通过categorical数据的categories 属性获得而数据的所一一对应的编码可以通过codes获得。
编码 | 水果 |
---|---|
0 | apple |
1 | pearl |
2 | orange |
当DataFrame里的某列数据采用categorical Data方式,那么这列数据的存储会大大降低。
import pandas as pd import time idx = [1,2,3,5,6,7,9,4,8] name = ["apple","pearl","orange", "apple","orange","orange","apple","pearl","orange"] price = [5.20,3.50,7.30,5.00,7.50,7.30,5.20,3.70,7.30] df = pd.DataFrame({ "fruit": name , "price" : price}, index = idx) print df,"\n" print df.memory_usage(),"\n" print df.dtypes print "*" * 20 df['fruit'] = df['fruit'].astype('category') print df print df.memory_usage(),"\n" print df.dtypes
程序的执行结果:
fruit price 1 apple 5.2 2 pearl 3.5 3 orange 7.3 5 apple 5.0 6 orange 7.5 7 orange 7.3 9 apple 5.2 4 pearl 3.7 8 orange 7.3 fruit 72 price 72 dtype: int64 fruit object price float64 dtype: object ******************** fruit price 1 apple 5.2 2 pearl 3.5 3 orange 7.3 5 apple 5.0 6 orange 7.5 7 orange 7.3 9 apple 5.2 4 pearl 3.7 8 orange 7.3 fruit 33 price 72 dtype: int64 fruit category price float64 dtype: object
最初创建的DataFrame变量df的各个列的类型:
fruit object price float64 dtype: object
经语句df['fruit'] = df['fruit'].astype('category')
将fruit列由Series改为了category类型。
fruit category price float64 dtype: object
请注意fruit列的类型的变化。正是因为fruit采用了category类型,其存储所需的空间由之前的
fruit 72 price 72 dtype: int64
变为
fruit 33 price 72 dtype: int64
即72变为33,变化了,尽管原始的DataFrame数据量不大,所以变化比率也不大。读者可以适当加大df的数据长度,可以看到很明显的存储容量的降低。
2 理解category
总结一下pandas的category数据,两次打印DataFrame数据df的结果都是一样的,但是第二次打印的df是其fruit列经语句df['fruit'] = df['fruit'].astype('category')
改变了其数据类型已不是Series而是category类型,该列存储所需的内存使用容量大大降低。
import pandas as pd import time idx = [1,2,3,5,6,7,9,4,8] name = ["apple","pearl","orange", "apple","orange","orange","apple","pearl","orange"] price = [5.20,3.50,7.30,5.00,7.50,7.30,5.20,3.70,7.30] #df = pd.DataFrame({ "fruit": name , "price" : price}, index = idx) N = 1 df = pd.DataFrame({ "fruit": name * N, "price" : price * N}, index = idx * N) df['fruit'] = df['fruit'].astype('category') print df,"\n" print "df.price.values\n", df.price.values,"\n" print "df.fruit.values\n", df.fruit.values, "\n" print "df.fruit.values.codes\n",df.fruit.values.codes, "\n" print "df.fruit.values.categories\n",df.fruit.values.categories, "\n"
fruit列是category类型的,通过codes和categorie组合出fruit的values。
fruit price 1 apple 5.2 2 pearl 3.5 3 orange 7.3 5 apple 5.0 6 orange 7.5 7 orange 7.3 9 apple 5.2 4 pearl 3.7 8 orange 7.3 df.price.values [5.2 3.5 7.3 5. 7.5 7.3 5.2 3.7 7.3] df.fruit.values [apple, pearl, orange, apple, orange, orange, apple, pearl, orange] Categories (3, object): [apple, orange, pearl] df.fruit.values.codes [0 2 1 0 1 1 0 2 1] df.fruit.values.categories Index([u'apple', u'orange', u'pearl'], dtype='object')
values对应于表1里的第2列即显示输出时“水果”,codes对应于表3的第2列即存储时“水果”列,categories对应于表2的“水果”列即有限唯一的一个集合。
3 总结
Categorical Data数据由codes和categories组成,categories是有限且唯一的分类集合,codes是原数据对应的分类的编码, Categorical Data不要求有限并唯一。
参考:
http://liao.cpython.org/pandas15/
Pandas的Categorical Data类型的更多相关文章
- Pandas的Categorical Data
http://liao.cpython.org/pandas15/ Docs » Pandas的Categorical Data类型 15. Pandas的Categorical Data panda ...
- Categorical Data
This is an introduction to pandas categorical data type, including a short comparison with R's facto ...
- 【转】浏览器中的data类型的Url格式,data:image/png,data:image/jpeg!
所谓"data"类型的Url格式,是在RFC2397中 提出的,目的对于一些"小"的数据,可以在网页中直接嵌入,而不是从外部文件载入.例如对于img这个Tag, ...
- ssm整合快速入门程序(三)之Data类型转换器
今天就写写springmvc配置Data类型转换器 首先在创建一个转换器的包cn.my.ssm.controller.converter,创建一个CustomDateConverter类实现Conve ...
- 第 7 章 Data 类型
目录 第 7 章 Data 类型 一.创建方式 二.转时间戳 其他 第 7 章 Data 类型 @(es5) 参考了: 阮一峰javascript的标准.<javascript高级教程> ...
- 浏览器中的data类型的Url格式,data:image/png,data:image/jpeg!(源自:http://blog.csdn.net/roadmore/article/details/38498719)
所谓"data"类型的Url格式,是在RFC2397中 提出的,目的对于一些“小”的数据,可以在网页中直接嵌入,而不是从外部文件载入.例如对于img这个Tag,哪怕这个图片非常非常 ...
- pandas的Categorical方法
对于数据样本的标签,如果我们事先不知道这个样本有多少类别,那么可以对数据集的类别列进行统计,这时我们用pandas的Categorical方法就非常快的实现. 1.说明: 你的数据最好是一个serie ...
- 如何将查出的日期Data类型以Json格式输出到前端
方法一 在返回的实体的属性中加上注解 // 创建时间 @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private ...
- go学习笔记-Data类型(Arrays, Slices and Maps)
Data类型(Arrays, Slices and Maps) array array就是数组,定义方式如下: var arr [n]type 在[n]type中,n表示数组的长度,type表示存储元 ...
随机推荐
- 每天进步一点点------Allegro 原理图到PCB网表导入
- IIS 无法读取配置节"system.web.extensions",因为它缺少节声明
IIS 无法读取配置节"system.web.extensions",因为它缺少节声明 先安装ASP.NET 4.0 然后: 今天在本地安装iis,搭建网站,应用程序的时候报错下 ...
- SPI(Service Provider Interface)--通过接口获取服务
spi 现在已有实现 jdk 提供实现 dubbo里的spi实现 一.jdk实现 配置 定义接口 定义实现类 配置资源文件 classpath下创建(META-INF/services/接口全面:ME ...
- Bugku-CTF之各种绕过
Day28 各种绕过 各种绕过哟 http://123.206.87.240:8002/web7/
- 更改mysql数据库默认的字符集(编码方式)
mysql数据库的默认编码方式是latin1, 在mysql中存储和显示中文时会产生乱码,必须要更改默认的编码方式为utf8 或 gbk.(以下以gbk为例.) 更改服务器的编码方式,在终端输入以下命 ...
- 吴裕雄 python 机器学习——局部线性嵌入LLE降维模型
# -*- coding: utf-8 -*- import numpy as np import matplotlib.pyplot as plt from sklearn import datas ...
- yii2时区语言设置
main.php return [ 'charset' => 'utf-8', 'language' => 'zh-CN', 'timeZone' => 'Asia/Shanghai ...
- 讲解一下类的继承super
class Test1(object): def __init__(self,ids): self.ids=ids class Par(Test1): def __init__(self,ids,us ...
- 操作word
package com.gwt.flow.task; import java.io.File; import java.io.FileInputStream; import java.io.FileN ...
- Unknown failure (Failure - not installed for 0) 、Error while Installing APKs
解决方法一: 设置 -> 更多设置 -> 开发者选项 ->关闭启用MIUI优化 解决方法二:(这种方法就用不了apply changes的功能了) 描述:在一些机型上安装软件 提示卸 ...