博客
关于我
pandas与excel联动-pandas基础7-Category类型
阅读量:645 次
发布时间:2019-03-15

本文共 3575 字,大约阅读时间需要 11 分钟。

Pandas Categorical分类详解:从基础到实战技巧

Categorical(类别)是Pandas中一个强大的数据类型,专为处理有限类别的数据设计。与传统的Python对象相比,Categorical类型能够在内存占用上更高效,尤其适用于分类问题中的类别型数据。以下将从基础到实战技巧,详细介绍如何使用Pandas Categorical进行数据处理和分析。

为Series指定Category

在Pandas中,Categorical类型可以通过提供特定的类别列表来创建。以下是创建Categorical类型的基本语法和使用方法:

pd.Categorical(values, categories=None, ordered=False)

参数说明:

  • values:原始数据值,可以是任意类型的数组或序列。
  • categories:自定义的类别列表。如果不提供,Pandas会自动从数据中提取唯一值作为类别。
  • ordered:布尔值,指定类别是否有序。默认为False,即类别无序。如果设置为True,类别将按照指定顺序排序。

示例代码:

import pandas as pdimport numpy as np# 创建包含缺失值的Categorical类型u1 = pd.Series(["A", "AB", np.nan, "AB", "O", "B"], index=[0, 1, 2, 3, 4, 5], name="blood_type")u2 = pd.Categorical(u1, categories=["A", "B", "AB"], ordered=True)# 输出结果print(u2)# 输出结果为:A, AB, NaN, AB, NaN, B# 类别为3个,顺序为A < B < AB

关键点:

  • ordered设为True时,类别将按指定顺序排列。
  • ordered设为False时,类别将按原样保留顺序。
  • 当数据中存在缺失值时,缺失值将自动转换为NaN

Series自动创建Category

Pandas能够自动将现有的Series转换为Categorical类型。以下示例展示了如何将一个普通的字符串Series转换为Categorical类型:

index = pd.Index(["Tom", "Bob", "Mary", "James", "Andy", "Alice"], name="name")user_info = pd.Series(["A", "AB", np.nan, "AB", "O", "B"], index=index, name="blood_type")u_c = user_info.astype("category")print(type(u_c))# 输出结果为:class 'pandas.core.series.series'print(u_c)# 输出结果为:# Name: blood_type, dtype: category# Categories (4, object): [A, AB, B, O]

关键点:

  • 使用.astype("category")方法可以将普通类型的Series转换为Categorical类型。
  • 转换后的Categorical类型的类别数量与原始数据中的唯一值数量一致。

查看类函数

在使用Categorical类型时,常需要查看类别相关的属性和统计信息。以下是一些常用的方法和属性:

统计信息

u_c.describe()# 输出结果为:# count    5# unique    4# top       AB# freq       2

频率分析

u_c.value_counts()# 输出结果为:# AB    2# O     1# B     1# A     1

类别属性

u_c.cat.categoriesIndex(['A', 'AB', 'B', 'O'], dtype='object')# 输出结果为:['A', 'AB', 'B', 'O']u_c.cat.ordered# 输出结果为:False

含有特定类别的检测

u_c.str.contains('A')# 输出结果为:# nameTom       True# Bob       True# Mary      NaN# James     True# Andy     False# Alice    False

合并Category

当需要将多个不同的Categorical类型合并时,可以使用以下方法:

方法1:转成Series再拼接

blood_type1 = pd.Categorical(["A", "AB"])blood_type2 = pd.Categorical(["B", "O"])after = pd.concat([pd.Series(blood_type1), pd.Series(blood_type2)])print(type(after))# 输出结果为:class 'pandas.core.series.series'

方法2:使用union_categoricals

from pandas.api.types import union_categoricalss = union_categoricals([blood_type1, blood_type2])print(s)# 输出结果为:# Categories (4, object): [A, AB, B, O]

修改Categorical属性

Categorical类型的类别可以通过以下方法进行修改:

重命名类别

u_c.cat.rename_categories(["A+", "AB+", "B+", "O+"])# 输出结果为:# Categories (4, object): [A+, AB+, B+, O+]

添加或删除类别

u_c.cat.add_categories(["X"])u_c.cat.remove_unused_categories(inplace=False)# 输出结果为:# Categories (5, object): [A+, AB+, B+, O+, X]

修改类别顺序

u_c.cat.as_ordered(inplace=False)u_c.cat.as_unordered(inplace=False)

连续属性离散化

在需要将连续变量离散化为有限类别时,可以使用Pandas的cutqcut函数。以下是使用这些函数的示例:

使用cut函数

pd.cut(x, bins, right=False, include_lowest=False, labels=None, retbins=False)

使用qcut函数

pd.qcut(x, q, labels=None, retbins=False)

示例代码:

import pandas as pd# 创建一个模拟的连续变量x = pd.Series([1., 2., 3., 4., 5., 6., 7., 8., 9.],              index=[0, 1, 2, 3, 4, 5, 6, 7, 8],              name="x")# 使用cut函数分割数据result = pd.cut(x, bins=[0., 3., 7.], labels=['Low', 'Medium', 'High'])print(result)# 输出结果为:Low, Low, Low, Low, Medium, Medium, High, High, High

关键点:

  • bins:可以是整数或其他类型的数组,用于定义分割点。
  • right:布尔值,决定区间的开闭方式,默认为left闭右开。
  • include_lowest:布尔值,决定是否将最低区间的左端点包含进去。
  • labels:用于指定分割后的区间的类别名称。
  • retbins:布尔值,决定是否返回分割点。

通过以上方法,可以将任意连续变量转换为有限类别,适用于分类模型的输入。

总结

Pandas的Categorical类型是一种强大的工具,能够高效处理有限类别的数据。在实际应用中,可以通过指定类别列表创建Categorical类型,或者将现有Series自动转换为Categorical类型。通过合并不同的Categorical类型,修改类别属性,离散化连续变量,可以充分发挥Categorical类型的优势,提升数据处理和分析效率。

转载地址:http://bielz.baihongyu.com/

你可能感兴趣的文章
mysql8.0新特性-自增变量的持久化
查看>>
Mysql8.0注意url变更写法
查看>>
Mysql8.0的特性
查看>>
MySQL8修改密码报错ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
查看>>
MySQL8修改密码的方法
查看>>
Mysql8在Centos上安装后忘记root密码如何重新设置
查看>>
Mysql8在Windows上离线安装时忘记root密码
查看>>
MySQL8找不到my.ini配置文件以及报sql_mode=only_full_group_by解决方案
查看>>
mysql8的安装与卸载
查看>>
MySQL8,体验不一样的安装方式!
查看>>
MySQL: Host '127.0.0.1' is not allowed to connect to this MySQL server
查看>>
Mysql: 对换(替换)两条记录的同一个字段值
查看>>
mysql:Can‘t connect to local MySQL server through socket ‘/var/run/mysqld/mysqld.sock‘解决方法
查看>>
MYSQL:基础——3N范式的表结构设计
查看>>
MYSQL:基础——触发器
查看>>
Mysql:连接报错“closing inbound before receiving peer‘s close_notify”
查看>>
mysqlbinlog报错unknown variable ‘default-character-set=utf8mb4‘
查看>>
mysqldump 参数--lock-tables浅析
查看>>
mysqldump 导出中文乱码
查看>>
mysqldump 导出数据库中每张表的前n条
查看>>