其他分享
首页 > 其他分享> > Pandas系列(五)-分类数据处理

Pandas系列(五)-分类数据处理

作者:互联网

内容目录

一、创建对象

方法一:明确指定 dtype="category"

index = pd.Index(data=["Tom", "Bob", "Mary", "James", "Andy", "Alice"], name="name")
user_info = pd.Series(data=["A", "AB", np.nan, "AB", "O", "B"], index=index, name="blood_type", dtype="category")
user_info
Out[6]: 
name
Tom        A
Bob       AB
Mary     NaN
James     AB
Andy       O
Alice      B
Name: blood_type, dtype: category
Categories (4, object): [A, AB, B, O]

方法二:使用 pd.Categorical 来构建分类数据。

pd.Categorical(["A", "AB", np.nan, "AB", "O", "B"])
Out[7]: 
[A, AB, NaN, AB, O, B]
Categories (4, object): [A, AB, B, O]

假定我们认为血型只有 A、B 以及 AB 这三类,那么我们可以这样操作。

#定制分类数据所有可能的取值
pd.Categorical(["A", "AB", np.nan, "AB", "O", "B"], categories=["A", "B", "AB"])
Out[8]: 
[A, AB, NaN, AB, NaN, B]
Categories (3, object): [A, B, AB]
#将遗传序列转化为分类数据
user_info = pd.Series(data=["A", "AB", np.nan, "AB", "O", "B"], index=index, name="blood_type")
user_info = user_info.astype("category")
user_info
Out[9]: 
name
Tom        A
Bob       AB
Mary     NaN
James     AB
Andy       O
Alice      B
Name: blood_type, dtype: category
Categories (4, object): [A, AB, B, O]

二、常用操作

可以对分类数据使用 .describe() 方法,它得到的结果与 string类型的数据相同。
count 表示非空的数据有5条,unique 表示去重后的非空数据有4条,top 表示出现次数最多的值为 AB,
freq 表示出现次数最多的值的次数为2次。
我们可以使用 .cat.categories 来获取分类数据所有可能的取值。
重命名分类数据:cat.rename_categories
添加分类数据:.cat.add_categories
删除分类数据:.cat.remove_categories
查看数据分布:。.value_counts()
通过.str访问
合并数据,用concat,类型变为object
保留分类数据类型,union_categoricals

user_info.describe()
user_info.cat.categories
user_info.cat.rename_categories(["A+", "AB+", "B+", "O+"])
user_info.str.contains('A')
#合并数据
blood_type1 = pd.Categorical(["A", "AB"])
blood_type2 = pd.Categorical(["B", "O"])
pd.concat([pd.Series(blood_type1), pd.Series(blood_type2)])
#保留分类数据
from pandas.api.types import union_categoricals
union_categoricals([blood_type1, blood_type2])

三、内存使用量的陷阱

Categorical 的内存使用量是与分类数乘以数据长度成正比,object 类型的数据是一个常数乘以数据的长度。
"""
blood_type = pd.Series(["AB","O"]*1000)
blood_type.nbytes
blood_type.astype("category").nbytes
blood_type = pd.Series(['AB%4d' % i for i in range(2000)])
blood_type.nbytes
blood_type.astype("category").nbytes

 

标签:info,AB,分类,blood,pd,数据处理,type,Pandas,user
来源: https://www.cnblogs.com/zhangyafei/p/10513729.html