📅  最后修改于: 2023-12-03 15:34:03.159000             🧑  作者: Mango
Pandas 是一个常用的数据处理库,它提供了分类数据的特殊数据类型实现。这些数据类型允许你在处理大量重复数据时,能够高效的计算和存储数据。
分类数据经常会出现在数据分析中,例如性别、区域、行业等。这些数据的取值只有有限的几个,并且重复出现多次。在数据分析中,经常需要统计这些数据的数量或者计算它们的平均值、最大值或最小值等;这时,如果将此类数据存储为普通的字符串类型,会占用较多的存储空间,并且在计算时需要循环整个数据集,速度极慢。
相比之下,分类数据类型的优点在于:
现在,让我们看一下分类数据类型的用法。
可以通过 pd.Categorical()
函数创建 Pandas 中的分类数据类型。对于一个普通的列表或数组,可以使用 pd.Categorical()
函数,将其转换为分类数据:
import pandas as pd
import numpy as np
# 创建一个列表
fruits = ['apple', 'orange', 'apple', 'apple'] * 2
# 将其转换为分类数据类型
fruits_cat = pd.Categorical(fruits)
print(fruits_cat)
输出结果:
[apple, orange, apple, apple, apple, orange, apple, apple]
Categories (2, object): [apple, orange]
上述代码中,通过 pd.Categorical()
函数将列表 fruits 转换为了分类数据类型。输出结果中,第一行是列表 fruits 经过 pd.Categorical()
函数转换后的结果,其中出现的 Categories (2, object)
指的是 fruits_cat 中包含 2 个不同的分类数据,分别是 apple
和 orange
。
上述代码中,我们已经创建了一个分类数据类型 objects,作为一个 Series 或 DataFrame 的列,可以直接使用它。
下面是一些分类数据类型的属性:
categories
:该属性返回分类数据中的所有类别。对于上面的代码来说,类别就是 ['apple', 'orange']
。codes
:该属性返回每个元素对应的整数代码。在上述代码中,对于数据中的元素来说,类别 apple
对应 0,类别 orange
对应 1。让我们看一下这些属性的用法:
# 输出类别
print(fruits_cat.categories)
# 输出代码
print(fruits_cat.codes)
输出结果:
Index(['apple', 'orange'], dtype='object')
[0 1 0 0 0 1 0 0]
一个已经存在的 Series 或 DataFrame 列可以通过调用 astype()
方法,并将其数据类型设置为 'category'
来转换为分类数据类型。
# 将列表转换为 Series 对象
fruits_series = pd.Series(fruits)
# 将 Series 对象转换为分类数据类型
fruits_series_cat = fruits_series.astype('category')
# 输出分类数据类型的所有类别和代码
print(fruits_series_cat.cat.categories)
print(fruits_series_cat.cat.codes)
输出结果:
Index(['apple', 'orange'], dtype='object')
0 0
1 1
2 0
3 0
4 0
5 1
6 0
7 0
dtype: int8
如果想要将分类数据转回原始的 Series 或 DataFrame 类型,可以使用 astype()
方法。
# 将分类数据转回原始的 Series 类型
fruits_series_des = fruits_series_cat.astype('object')
# 输出原始的 Series 类型
print(fruits_series_des)
输出结果:
0 apple
1 orange
2 apple
3 apple
4 apple
5 orange
6 apple
7 apple
dtype: object
Pandas 中的分类数据类型是可选的,包括备选的缺失值表示方法。使用缺失值的分类数据表现形式是 NaN
。
# 创建一个包含缺失值的 Series
fruits_with_nan = pd.Series(['apple', 'orange', np.nan, 'apple'] * 2)
# 将其转换为分类数据类型
fruits_with_nan_cat = fruits_with_nan.astype('category')
# 输出分类数据类型的所有类别和代码
print(fruits_with_nan_cat.cat.categories)
print(fruits_with_nan_cat.cat.codes)
输出结果:
Index(['apple', 'orange'], dtype='object')
0 0
1 1
2 -1
3 0
4 0
5 1
6 -1
7 0
dtype: int8
分类数据类型支持大部分与字符串类型相似的方法,例如 len()
、in
运算符等。
# 创建一个包含重复元素的 Series
s = pd.Series(['apple', 'orange', 'apple', 'banana'] * 2)
# 将其转换为分类数据类型
s = s.astype('category')
# 统计数据中每个值出现的次数
print(s.value_counts())
输出结果:
apple 4
banana 2
orange 2
dtype: int64
分类数据类型还支持多数数组操作,例如切片和向量化操作。
# 获取数据中前面 3 个元素
s[:3]
输出结果:
0 apple
1 orange
2 apple
dtype: category
Categories (3, object): [apple, banana, orange]
代码片段: