Python Pandas 高级数据操作 Categorical 数据类型的使用

Categorical 数据类型是用于表示基于类别的数据的特殊类型。使用 Categorical 数据类型不仅可以提高性能,还可以节省内存,尤其是在处理具有重复值的字符串数据时。Categorical 数据类型仅适用于分类数据。

1、创建 Categorical 数据

pd.Categorical()函数用于将一个列表、数组或类似的序列转换为分类数据(categorical data)。分类数据是一种特殊的数据类型,用于表示具有固定数量可能值的变量,类似于枚举类型。通过将数据转换为 Categorical 类型,可以提高数据处理的效率,尤其是在进行分类分析或处理具有明确类别的数据时。

参数

描述

values

类似列表:分类的值。

如果给定了类别,不在类别中的值将被替换为 NaN。

categories

类似索引(唯一),

可选:这个分类的唯一类别。

如果未给出,类别假定为values的唯一值

(如果可能的话按排序,否则按照它们出现的顺序)。

ordered

布尔值,默认为 False:这个分类是否被视为有序分类。

如果为 True,则结果分类将是有序的。

一个有序的分类在排序时,

会尊重其类别属性的顺序

(反过来这个类别属性就是提供的类别参数)。

dtype

CategoricalDtype:用于这个分类的 CategoricalDtype 实例。

从版本 0.21.0 开始新增。

使用示例:

import pandas as pd

# 创建一个简单的列表
data = ['low', 'medium', 'high', 'medium', 'low']

# 使用pd.Categorical()创建分类数据
# 指定类别,并设置有序
cat_data = pd.Categorical(data, categories=['low', 'medium', 'high'], ordered=True)

print("有序分类数据:\n", cat_data)

# 创建一个DataFrame,使用指定的CategoricalDtype
df = pd.DataFrame({
    'Quality': pd.Categorical(data, categories=['low', 'medium', 'high'], ordered=True, dtype="category")
})

print("\nDataFrame:\n", df)

# 原始数据
data = ['cold', 'warm', 'hot', 'warm', 'cold', 'hot']

# 将数据转换为分类类型
# 指定类别,并设置为有序分类
temperature_category = pd.Categorical(data, categories=['cold', 'warm', 'hot'], ordered=True)

# 创建一个Categorical Series
temperature_series = pd.Series(temperature_category)

print("Categorical Series:\n", temperature_series)

# 检查Series的dtype
print("\nSeries dtype:", temperature_series.dtype)

# 示例:使用Categorical Series进行条件过滤
filtered_series = temperature_series[temperature_series > 'cold']
print("\nFiltered Series (items greater than 'cold'):\n", filtered_series)

2、将列转换为 Categorical

将列转换为分类类型(Categorical)是一个常见的数据操作,尤其是在数据预处理和内存优化方面非常有用。使用 astype('category') 将 DataFrame 或 Series 中的列转换为 Categorical 类型。

import pandas as pd

# 示例数据
data = {'Langs': ['C', 'Python', 'C', 'Python', 'Java', 'C']}
df = pd.DataFrame(data)

# 将 Country 列转换为分类类型
df['Langs'] = df['Langs'].astype('category')

# 显示数据和列的数据类型
print(df)
print(df.dtypes)

3、处理Categorical列中的缺失值

处理包含缺失值的 Categorical 列是一项常见的高级数据操作。Categorical 数据类型是 Pandas 用于表示分类数据的一种特殊类型。当处理这种类型的数据时,特别是当它们包含缺失值(通常表示为 NaN)时,需要谨慎处理。

import pandas as pd
import numpy as np

# 创建一个包含 Categorical 列的示例 DataFrame
df = pd.DataFrame({
    'category_column': pd.Categorical(['cat1', 'cat2', np.nan, 'cat1', 'cat2', np.nan], categories=['cat1', 'cat2', 'Unknown'])
})

# 方法1: 使用 fillna() 填充缺失值(确保 'Unknown' 已在分类中)
df_fillna = df.copy()
df_fillna['category_column'] = df_fillna['category_column'].fillna('Unknown')

# 方法2: 使用 dropna() 删除缺失值
df_dropna = df.dropna(subset=['category_column'])

# 方法3: 转换为其他类型后处理
df_convert = df.copy()
df_convert['category_column'] = df_convert['category_column'].astype(str)  # 转换为字符串
df_convert['category_column'] = df_convert['category_column'].replace('nan', 'Unknown')  # 替换 'nan'
df_convert['category_column'] = df_convert['category_column'].astype('category')  # 转换回 Categorical


# 输出结果
print(df)
print("\n")
print(df_fillna)
print("\n")
print(df_dropna)
print("\n")
print(df_convert)

4、使用Categorical列进行操作

Categorical 列支持大多数标准的 DataFrame 操作,包括分组、排序和汇总。使用 Categorical 类型可以进行更有效的内存使用和更快的计算,尤其是在数据集包含重复类别时。

import pandas as pd

# 创建分类
categories = ["A", "B", "C"]

# 创建 Categorical 列
data = pd.Categorical(["A", "B", "C", "A", "B"], categories=categories)

# 比较数据
print(data == "A")


# 索引数据
print(data[1])


# 统计数据
print(data.describe())


# 排序数据
print(data.sort_values())

# 对每个分类的计数
print(data.value_counts())

5、Categorical 数据的优势

当类别相对于数据量较少时,使用 Categorical 类型可以节省内存。某些操作在 Categorical 类型上执行得更快,如排序和分组(groupby)。Categorical 类型可以是有序的或无序的。有序的 Categorical 允许进行排序和比较操作。使用数值编码来表示每个类别,而不是存储重复的字符串。对大型数据集进行分组和聚合时,Categorical类型的性能显著优于对象类型。通过定义可能的类别集合,Categorical数据有助于保证数据完整性。使用Categorical数据类型使得数据分析更加方便和直观,特别是在处理具有自然顺序的类别数据时。

6、使用总结

当转换为 Categorical 类型时,所有不同的值都变成了类别。如果类别太多,可能不会节省内存。对于有序的 Categorical,需要明确指定类别的顺序。在 Categorical 类型的列中,只能使用定义的类别值。尝试使用未定义的类别将引发错误。

推荐阅读
cjavapy编程之路首页