本文共 3575 字,大约阅读时间需要 11 分钟。
Categorical(类别)是Pandas中一个强大的数据类型,专为处理有限类别的数据设计。与传统的Python对象相比,Categorical类型能够在内存占用上更高效,尤其适用于分类问题中的类别型数据。以下将从基础到实战技巧,详细介绍如何使用Pandas Categorical进行数据处理和分析。
在Pandas中,Categorical类型可以通过提供特定的类别列表来创建。以下是创建Categorical类型的基本语法和使用方法:
pd.Categorical(values, categories=None, ordered=False)
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
。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类型时,常需要查看类别相关的属性和统计信息。以下是一些常用的方法和属性:
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
当需要将多个不同的Categorical类型合并时,可以使用以下方法:
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'
from pandas.api.types import union_categoricalss = union_categoricals([blood_type1, blood_type2])print(s)# 输出结果为:# Categories (4, object): [A, AB, B, O]
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的cut
和qcut
函数。以下是使用这些函数的示例:
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
left
闭右开。通过以上方法,可以将任意连续变量转换为有限类别,适用于分类模型的输入。
Pandas的Categorical类型是一种强大的工具,能够高效处理有限类别的数据。在实际应用中,可以通过指定类别列表创建Categorical类型,或者将现有Series自动转换为Categorical类型。通过合并不同的Categorical类型,修改类别属性,离散化连续变量,可以充分发挥Categorical类型的优势,提升数据处理和分析效率。
转载地址:http://bielz.baihongyu.com/