第8章 pandas分类数据(初学者必学)

在拿到一份数据准备做挖掘建模之前,首先需要进行初步的数据探索性分析,对数据探索性分析之后要先进行一系列的数据预处理步骤。因为拿到的原始数据存在不完整、不一致、有异常的数据,而这些“错误”数据会严重影响到数据挖掘建模的执行效率甚至导致挖掘结果出现偏差,因此首先要数据清洗。数据清洗完成之后接着进行或者同时进行数据集成、转换、归一化等一系列处理,该过程就是数据预处理。一方面是提高数据的质量,另一方面可以让数据更好的适应特定的挖掘模型,在实际工作中该部分的内容可能会占整个工作的70%甚至更多。

系列文章
第1章 Pandas基础操作(使用pandas进行数据分析,从小白逆袭大神,你会了吗?)
第2章 精通pandas索引操作(使用pandas进行数据分析,从小白逆袭大神,你会了吗?)
第3章 Pandas 分组(使用pandas进行数据分析,从小白逆袭大神,你会了吗?)
第4章 精通pandas变形操作(使用pandas进行数据分析,从小白逆袭大神,你会了吗?)
第5章 精通pandas合并操作(使用pandas进行数据分析,从小白逆袭大神,你会了吗?)
第6章 pandas缺失数据(初学者需要掌握的几种基本的数据预处理方法_缺失)
第7章 pandas文本数据(初学者需要掌握的几种基本的数据预处理方法)

第8章 分类数据

import pandas as pd
import numpy as np
df = pd.read_csv('data/table.csv')
df.head()

在这里插入图片描述

一、category的创建及其性质

1. 分类变量的创建

(a)用Series创建

pd.Series(["a", "b", "c", "a"], dtype="category")

在这里插入图片描述.
(b)对DataFrame指定类型创建

temp_df = pd.DataFrame({'A':pd.Series(["a", "b", "c", "a"], dtype="category"),'B':list('abcd')})
temp_df.dtypes

在这里插入图片描述
(c)利用内置Categorical类型创建

cat = pd.Categorical(["a", "b", "c", "a"], categories=['a','b','c'])
pd.Series(cat)

在这里插入图片描述
(d)利用cut函数创建

默认使用区间类型为标签

 pd.cut(np.random.randint(0,60,5), [0,10,30,60])

在这里插入图片描述
可指定字符为标签.

pd.cut(np.random.randint(0,60,5), [0,10,30,60], right=False, labels=['0-10','10-30','30-60'])

在这里插入图片描述

2. 分类变量的结构

一个分类变量包括三个部分,元素值(values)、分类类别(categories)、是否有序(order)
从上面可以看出,使用cut函数创建的分类变量默认为有序分类变量

下面介绍如何获取或修改这些属性

(a)describe方法

该方法描述了一个分类序列的情况,包括非缺失值个数、元素值类别数(不是分类类别数)、最多次出现的元素及其频数

s = pd.Series(pd.Categorical(["a", "b", "c", "a",np.nan], categories=['a','b','c','d']))
s.describe()

在这里插入图片描述

(b)categories和ordered属性

查看分类类别和是否排序

s.cat.categories

在这里插入图片描述

s.cat.ordered

在这里插入图片描述

3. 类别的修改

(a)利用set_categories修改

修改分类,但本身值不会变化

s = pd.Series(pd.Categorical(["a", "b", "c", "a",np.nan], categories=['a','b','c','d']))
s.cat.set_categories(['new_a','c'])

在这里插入图片描述
(b)利用rename_categories修改

需要注意的是该方法会把值和分类同时修改

s = pd.Series(pd.Categorical(["a", "b", "c", "a",np.nan], categories=['a','b','c','d']))
s.cat.rename_categories(['new_%s'%i for i in s.cat.categories])

在这里插入图片描述
利用字典修改值

s.cat.rename_categories({'a':'new_a','b':'new_b'})

在这里插入图片描述
(c)利用add_categories添加

s = pd.Series(pd.Categorical(["a", "b", "c", "a",np.nan], categories=['a','b','c','d']))
s.cat.add_categories(['e'])

在这里插入图片描述
(d)利用remove_categories移除

s = pd.Series(pd.Categorical(["a", "b", "c", "a",np.nan], categories=['a','b','c','d']))
s.cat.remove_categories(['d'])

在这里插入图片描述
(e)删除元素值未出现的分类类型

s = pd.Series(pd.Categorical(["a", "b", "c", "a",np.nan], categories=['a','b','c','d']))
s.cat.remove_unused_categories()

在这里插入图片描述

二、分类变量的排序

前面提到,分类数据类型被分为有序和无序,这非常好理解,例如分数区间的高低是有序变量,考试科目的类别一般看做无序变量

1. 序的建立

(a)一般来说会将一个序列转为有序变量,可以利用as_ordered方法

s = pd.Series(["a", "d", "c", "a"]).astype('category').cat.as_ordered()
s

在这里插入图片描述
退化为无序变量,只需要使用as_unordered

s.cat.as_unordered()

在这里插入图片描述
(b)利用set_categories方法中的order参数

pd.Series(["a", "d", "c", "a"]).astype('category').cat.set_categories(['a','c','d'],ordered=True)

在这里插入图片描述
(c)利用reorder_categories方法

这个方法的特点在于,新设置的分类必须与原分类为同一集合

s = pd.Series(["a", "d", "c", "a"]).astype('category')
s.cat.reorder_categories(['a','c','d'],ordered=True)

在这里插入图片描述

#s.cat.reorder_categories(['a','c'],ordered=True) #报错
#s.cat.reorder_categories(['a','c','d','e'],ordered=True) #报错

2. 排序

先前在第1章介绍的值排序和索引排序都是适用的

s = pd.Series(np.random.choice(['perfect','good','fair','bad','awful'],50)).astype('category')
s.cat.set_categories(['perfect','good','fair','bad','awful'][::-1],ordered=True).head()

在这里插入图片描述

s.sort_values(ascending=False).head()

在这里插入图片描述

df_sort = pd.DataFrame({'cat':s.values,'value':np.random.randn(50)}).set_index('cat')
df_sort.head()

在这里插入图片描述

df_sort.sort_index().head()

在这里插入图片描述

三、分类变量的比较操作

1. 与标量或等长序列的比较

(a)标量比较

s = pd.Series(["a", "d", "c", "a"]).astype('category')
s == 'a'

在这里插入图片描述
(b)等长序列比较

s == list('abcd')

在这里插入图片描述

2. 与另一分类变量的比较

(a)等式判别(包含等号和不等号)

两个分类变量的等式判别需要满足分类完全相同

s = pd.Series(["a", "d", "c", "a"]).astype('category')
s == s

在这里插入图片描述

s != s

在这里插入图片描述

s_new = s.cat.set_categories(['a','d','e'])
#s == s_new #报错

(b)不等式判别(包含>=,<=,<,>)

两个分类变量的不等式判别需要满足两个条件:① 分类完全相同 ② 排序完全相同

s = pd.Series(["a", "d", "c", "a"]).astype('category')
#s >= s #报错
s = pd.Series(["a", "d", "c", "a"]).astype('category').cat.reorder_categories(['a','c','d'],ordered=True)
s >= s

在这里插入图片描述
代码和数据地址:https://github.com/XiangLinPro/pandas

另外博主收藏这些年来看过或者听过的一些不错的常用的上千本书籍,没准你想找的书就在这里呢,包含了互联网行业大多数书籍和面试经验题目等等。有人工智能系列(常用深度学习框架TensorFlow、pytorch、keras。NLP、机器学习,深度学习等等),大数据系列(Spark,Hadoop,Scala,kafka等),程序员必修系列(C、C++、java、数据结构、linux,设计模式、数据库等等)以下是部分截图

更多文章见本原创微信公众号「五角钱的程序员」,我们一起成长,一起学习。一直纯真着,善良着,温情地热爱生活。关注回复【电子书】即可领取哦

在这里插入图片描述
在这里插入图片描述

给大家推荐一个Github,上面非常非常多的干货:https://github.com/XiangLinPro/IT_book

There is no such thing as a great talent without great will - power.——Balzac
「没有伟大的意志力,便没有雄才大略。——巴尔扎克」

关于Datawhale

Datawhale是一个专注于数据科学与AI领域的开源组织,汇集了众多领域院校和知名企业的优秀学习者,聚合了一群有开源精神和探索精神的团队成员。Datawhale以“for the learner,和学习者一起成长”为愿景,鼓励真实地展现自我、开放包容、互信互助、敢于试错和勇于担当。同时Datawhale 用开源的理念去探索开源内容、开源学习和开源方案,赋能人才培养,助力人才成长,建立起人与人,人与知识,人与企业和人与未来的联结。

2020.5.27 城口

猜你喜欢

转载自blog.csdn.net/youif/article/details/106383587
今日推荐