【pandas小技巧】--category类型补充

pandas,技巧,category,类型,补充 · 浏览次数 : 119

小编点评

**category类型在pandas基础系列中的优势** **1. 高效的数值处理** * category 类型使用字典存储各个值的名称,并根据名称自动排序。 * 这可以极大地提高数值处理效率,因为不需要像字符串类型一样进行格式转换。 **2. 调整数值范围的分类** * 可以使用 categories 参数定义各个值的默认排序顺序。 * 也可以使用 bins 参数指定分类范围,并根据范围进行分类。 **问题** **1. category 类型顺序调整** * 默认顺序按照字母顺序排列。 * 可以使用 categories 参数设置排序顺序。 **2. 按范围转换 catagory 类型** * cut 函数根据值的大小将数据分为bins。 * bins 的数目可以自定义,但默认情况下每组包含相同或接近相同数量的数据点。 * qcut 函数根据值的大小将数据分为bins,每个 bin 中含有的数据个数相同或尽可能接近。

正文

category类型在pandas基础系列中有一篇介绍数据类型的文章中已经介绍过。
category类型并不是python中的类型,是pandas特有的类型。

category类型的优势那篇文章已经介绍过,当时只是介绍了如何将某个列的数据转换成category类型,
以及转换之后给程序性能上带来的好处。

本篇将补充介绍深入使用category类型时,经常会遇到的两个问题。
一个是category类型中各个值的顺序调整;另一个是按照数值的范围转换为category类型。

1. catagory类型顺序

当我们把一个列的数据转换为category类型时,category类型中各个值的默认顺序是按照字母顺序排列的。
比如:

import pandas as pd

df = pd.DataFrame({
    "学号": [1, 2, 3, 4, 5, 6],
    "年级": ["初二", "初一", "初二",
           "初一", "初三", "初三"],
})

df["年级"] = df["年级"].astype('category')
df.sort_values("年级")

image.png
我们发现,默认顺序 **初三 **排在 **初二 **之前,与实际情况不符。

所以,需要调整category类型的顺序。

import pandas as pd

df = pd.DataFrame({
    "学号": [1, 2, 3, 4, 5, 6],
    "年级": ["初二", "初一", "初二",
           "初一", "初三", "初三"],
})

g_type = pd.CategoricalDtype(
    categories=["初一", "初二", "初三"],
    ordered=True
)

df["年级"] = df["年级"].astype(g_type)
df.sort_values("年级")

image.png
通过CategoricalDtype函数定义category类型,可以在定义时设置各个值的顺序。

2. 按范围转换catagory类型

有时候我们需要将一批的连续的数据按照不同的范围转换为category类型。

比如下面随机生成的100个介于180岁的年龄数据:

df = pd.DataFrame(
    np.random.randint(1, 80, (100, 1))
)
df.columns = ["年龄"]
df

image.png
希望按照不同的年龄范围划分年龄段,而不是每个年龄都转换为category类型。

这时可以用cut函数来实现:

df["年龄段"] = pd.cut(df["年龄"], 
                bins=[0, 18, 25, 60, 80],
                labels=["儿童", "青年", 
                        "成人", "老人"]
                )
df

image.png
按照年龄段来划分不同的category

  1. bins参数:设置每个category对应的范围
  2. labels参数:category的值,labels列表中值的顺序就是category的顺序

除了cut函数,还有个qcut函数,也可以按照数据范围来生成category类型。
它们的区别主要在于:

  1. cut函数:根据值的大小将数据分为binsbins的数目可以是等距的,也可以是自定义的。
  2. qcut函数:根据值的频率将数据分为bins,每个bin中含有的数据个数相同或尽可能接近。bins的数量由程序自动确定。

因此,cut函数适合等距离离散化,而qcut函数适合非等距离离散化。
例如,我们有1000个数据点,想要把它们分为10组,
cut函数通常会将数据平均分为长度相同的10个组,
qcut函数则会将这些数据分为包含大约100个数据点的10个组。

与【pandas小技巧】--category类型补充相似的内容:

【pandas小技巧】--category类型补充

`category`类型在**pandas基础**系列中有一篇介绍数据类型的文章中已经介绍过。`category`类型并不是`python`中的类型,是`pandas`特有的类型。 `category`类型的优势那篇文章已经介绍过,当时只是介绍了如何将某个列的数据转换成`category`类型,以及

【pandas小技巧】--日期相关处理

日期处理相关内容之前`pandas基础`系列中有一篇专门介绍过,本篇补充两个常用的技巧。 # 1. 多列合并为日期 当收集来的数据中,年月日等信息分散在多个列时,往往需要先合并成日期类型,然后才能做分析处理。合并多列转换为日期类型,可以直接用 `to_datetime`函数来处理: ```pytho

【pandas小技巧】--数据转置

所谓**数据转置**,就是是将原始数据表格沿着对角线翻折,使原来的行变成新的列,原来的列变成新的行,从而更方便地进行数据分析和处理。 `pandas`中`DataFrame`的转置非常简单,每个`DataFrame`对象都有一个`T`属性,通过这个属性就能得到转置之后的`DataFrame`。下面介

【pandas小技巧】--统计值作为新列

这次介绍的小技巧不是统计,而是把统计结果作为**新列**和原来的数据放在一起。`pandas`的各种统计功能之前已经介绍了不少,但是每次都是统计结果归统计结果,原始数据归原始数据,没有把它们合并在一个数据集中来观察。 下面通过两个场景示例来演示如果把统计值作为新列的数据。 # 1. 成绩统计的场景

【pandas小技巧】--DataFrame的显示参数

我们在`jupyter notebook`中使用`pandas`显示`DataFrame`的数据时,由于屏幕大小,或者数据量大小的原因,常常会觉得显示出来的表格不是特别符合预期。 这时,就需要调整`pandas`显示`DataFrame`的方式。`pandas`为我们提供了很多调整显示方式的参数,具

【pandas小技巧】--DataFrame的显示样式

上一篇介绍了`DataFrame`的显示参数,主要是对`DataFrame`中值进行调整。 本篇介绍`DataFrame`的显示样式的调整,显示样式主要是对表格本身的调整,比如颜色,通过颜色可以突出显示重要的值,观察数据时可以更加高效的获取主要信息。 下面介绍一些针对单个数据和批量数据的样式调整方式

【pandas小技巧】--花哨的DataFrame

最近github上发现了一个库(`plottable`),可以用简单的方式就设置出花哨的 `DataFrame` 样式。 github上的地址:[https://github.com/znstrider/plottable](https://github.com/znstrider/plottabl

【pandas小技巧】--目录(完结)

`pandas`小技巧系列是介绍的是使用`pandas`分析数据时,最常用的一些操作技巧。 具体包括: 1. [创建测试数据](https://www.cnblogs.com/wang_yb/p/17552748.html) 学习pandas的过程中,为了尝试pandas提供的各类功能强大的函数,常

【pandas小技巧】--创建测试数据

学习`pandas`的过程中,为了尝试`pandas`提供的各类功能强大的函数,常常需要花费很多时间去创造测试数据。 在`pandas`中,快速创建测试数据可以更快的评估 `pandas` 函数。通过生成一组测试数据,可以评估例如 `read_csv`、`read_excel`、`groupby`等

【pandas小技巧】--读取多个文件

日常分析数据时,只有单一数据文件的情况其实很少见,更多的情况是,我们从同一个数据来源定期或不定期的采集了很多数据文件;或者从不同的数据源采集多种不同格式的数据文件。 在这样的情况下,分析数据之前,需要将不同的数据集合并起来。合并数据一般有两个维度,一是同构的数据集合并后行数增加;一是异构的数据集合并