博客
关于我
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/

你可能感兴趣的文章
MySQL – 导出数据成csv
查看>>
MySQL —— 在CentOS9下安装MySQL
查看>>
mysql 不区分大小写
查看>>
mysql 两列互转
查看>>
MySQL 中开启二进制日志(Binlog)
查看>>
MySQL 中文问题
查看>>
MySQL 中日志的面试题总结
查看>>
mysql 中的all,5分钟了解MySQL5.7中union all用法的黑科技
查看>>
Mysql 中的日期时间字符串查询
查看>>
MySQL 中锁的面试题总结
查看>>
MySQL 中随机抽样:order by rand limit 的替代方案
查看>>
MySQL 为什么需要两阶段提交?
查看>>
mysql 为某个字段的值加前缀、去掉前缀
查看>>
mysql 主从
查看>>
mysql 主从 lock_mysql 主从同步权限mysql 行锁的实现
查看>>
mysql 主从互备份_mysql互为主从实战设置详解及自动化备份(Centos7.2)
查看>>
mysql 主从关系切换
查看>>
mysql 主键重复则覆盖_数据库主键不能重复
查看>>
Mysql 优化 or
查看>>
mysql 优化器 key_mysql – 选择*和查询优化器
查看>>