首页 > 其他分享 >【pandas小技巧】--category类型补充

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

时间:2023-08-21 09:33:16浏览次数:36  
标签:category cut -- df pd 类型 年级 pandas

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个组。

标签:category,cut,--,df,pd,类型,年级,pandas
From: https://www.cnblogs.com/wang_yb/p/17645158.html

相关文章

  • ARM Trusted Firmware分析——中断、异常
     中断如何送到不同EL?如何配置?1.BL31异常向量表BL31异常向量表根据如下定义实现:ARMv8-A规定ExceptionVectorTable大小为2KB,并且是2KB对齐;一共6个VectorEntry,每一个VectorEntry大小为128B。.macrovector_baselabel,section_name=.vectors.section\sectio......
  • pytest+yaml测试用例
    #一、yaml格式##yaml是一种数据类型,可以和json之间灵活的切换,支持注释、换行、字符串等。可以用于配置文件或编写测试用例。##数据结构:一般是键值对的方式出现。注意编写时值前面必须有空格,键:(空格)值。##如果是数组,以-(空格)开头来表示##以user.yaml为例,这里编写两个用例,每个用......
  • Leetcode 242. 有效的字母异位词(Valid anagram)
    题目链接......
  • 06-中断详解
    目录一.中断原理二.NVIC详解一.中断原理1.中断过程和术语2.中断优先级概念3.中断优先级的表述方法4.中断源类型5.中断源的4种状态二.NVIC详解1.NVIC概念2.中断协作模型......
  • Neo4j Neo.TransientError.General.MemoryPoolOutOfMemoryError
    Theallocationofanextra4.0MiBwouldusemorethanthelimit2.0GiB.Currentlyusing2.0GiB.dbms.memory.transaction.total.maxthresholdreached#通过语句查看,发现捞出来的数据太多,导致内存溢出MATCH(cwt:Persion)RETURNcwt......
  • PLS-00103: 出现符号 ")"在需要下列之一时
    执行Oracle存储过程时,出现“PLS-00103:出现符号")"在需要下列之一时:”,Cause:java.sql.SQLException:ORA-06550:第22行,第4列:PLS-00103:出现符号")"在需要下列之一时:(-+casemodnewnotnull<anidentifier><adouble-quoteddelimited-identifier>......
  • 《控制台篇》c#程序的通用结构
    通用结构://AskeletonofaC#programusingSystem;namespaceYourNamespace{ classYourClass { } structYourStruct { } interfaceIYourInterface { } delegateintYourDelegate(); enumYourEnum { } namespaceYourNestedNamespace { struct......
  • VisionPro学习日志(五)
    VisionPro学习日志(五)案例1:多目标检测(动态使用卡尺)检测流程:首先使用斑点工具,显示出每一个白色矩形框,然后使用卡尺工具测量每一个黑框的高度。#regionnamespaceimportsusingSystem;usingSystem.Collections;usingSystem.Drawing;usingSystem.IO;usingSystem.Wind......
  • python+allure生成测试报告
    #一、allure安装##下载地址:CentralRepository:io/qameta/allure/allure-commandline(apache.org)##下载需要安装的版本,这里我选择的是2.9的版本##图片##下载解压完成后,将bin文件夹所在的目录放入环境变量中,同时需要安装JDK。##完成后,命令行pipinstallallure-pytest安装......
  • Python程序员Visual Studio Code指南3 编辑代码
    3编辑代码VisualStudioCode提供了许多适用于所有编程语言的标准编辑功能。快速修复代码补全定义声明格式化语法重构代码片段这些内置的编辑功能减少了编辑代码所需的手动任务和键入次数,从而节省了时间。Python扩展扩展了代码编辑功能。有了Python扩展,导入库只需极......