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
类型的列中,只能使用定义的类别值。尝试使用未定义的类别将引发错误。