jpyful pandas task9-分类数据

本文详细介绍了Pandas库中category类型的数据操作,包括如何将序列转换为分类变量、访问和修改类别、增加删除类别、设置有序分类以及区间类别构造。讨论了排序、比较和区间判断等操作,同时展示了cut和qcut函数用于区间构造的方法。通过实例演示了如何在DataFrame中对分类变量进行排序和比较,以及如何处理有序和无序分类。
摘要由CSDN通过智能技术生成

1.cat对象
1.cat对象的属性
1.在pandas中提供了category类型,使用户能够处理分类类型的变量,将一个普通序列转换成分类变量可以使用astype方法。
df = pd.read_csv(’…/data/learn_pandas.csv’, usecols = [‘Grade’, ‘Name’, ‘Gender’, ‘Height’, ‘Weight’])
s = df.Grade.astype(‘category’)
s.head()
2.对于一个具体的分类,有两个组成部分,其一为类别的本身,它以Index类型存储,其二为是否有序,它们都可以通过cat的属性被访问:
s.cat.categories
3.每一个序列的类别会被赋予唯一的整数编号,它们的编号取决于cat.categories中的顺序,该属性可以通过codes访问:
s.cat.codes.head()

2.类别的增加、删除和修改
1.对于类别的增加可以使用add_categories:
s = s.cat.add_categories(‘Graduate’) # 增加一个毕业生类别
2.要删除某一个类别可以使用remove_categories,同时所有原来序列中的该类会被设置为缺失。例如,删除大一的类别:
s = s.cat.remove_categories(‘Freshman’)
3.此外可以使用set_categories直接设置序列的新类别,原来的类别中如果存在元素不属于新类别,那么会被设置为缺失。
s = s.cat.set_categories([‘Sophomore’,‘PhD’]) # 新类别为大二学生和博士
4.如果想要删除未出现在序列中的类别,可以使用remove_unused_categories来实现:
s = s.cat.remove_unused_categories() # 移除了未出现的博士生类别
5.修改的操作可以通过rename_categories方法完成,同时需要注意的是,这个方法会对原序列的对应值也进行相应修改。
s = s.cat.rename_categories({‘Sophomore’:‘本科二年级学生’})

2.有序分类
1.序的建立
有序类别和无序类别可以通过as_unordered和reorder_categories互相转化,需要注意的是后者传入的参数必须是由当前序列的无需类别构成的列表,不能够增加新的类别,也不能缺少原来的类别,并且必须指定参数ordered=True,否则方法无效。例如,对年级高低进行相对大小的类别划分,然后再恢复无序状态:
s = df.Grade.astype(‘category’)
s = s.cat.reorder_categories([‘Freshman’, ‘Sophomore’, ‘Junior’, ‘Senior’],ordered=True)
2.排序和比较
1.在第二章中,曾提到了字符串和数值类型序列的排序,此时就要说明分类变量的排序:只需把列的类型修改为category后,再赋予相应的大小关系,就能正常地使用sort_index和sort_values。例如,对年级进行排序:
df.Grade = df.Grade.astype(‘category’)
df.Grade = df.Grade.cat.reorder_categories([‘Freshman’, ‘Sophomore’, ‘Junior’, ‘Senior’],ordered=True)
df.sort_values(‘Grade’).head() # 值排序
df.set_index(‘Grade’).sort_index().head() # 索引排序
2.由于序的建立,因此就可以进行比较操作。分类变量的比较操作分为两类,第一种是==或!=关系的比较,比较的对象可以是标量或者同长度的Series(或list),第二种是>,>=,<,<=四类大小关系的比较,比较的对象和第一种类似,但是所有参与比较的元素必须属于原序列的categories,同时要和原序列具有相同的索引。
code:
res4 = df.Grade <= df.Grade.sample(frac=1).reset_index(drop=True) # 打乱后比较

3.区间类别
1. 利用cut和qcut进行区间构造
res = pd.cut(s, bins=2, labels=[‘small’, ‘big’], retbins=True)
pd.qcut(s, q=[0,0.2,0.8,1]).head()
2.一般区间的构造
对于某一个具体的区间而言,其具备三个要素,即左端点、右端点和端点的开闭状态,其中开闭状态可以指定right, left, both, neither中的一类:
1.my_interval = pd.Interval(0, 1, ‘right’)
2.my_interval.overlaps(my_interval_2)#判断两个区间是否有交集
3.pd.IntervalIndex对象有四类方法生成,分别是from_breaks, from_arrays, from_tuples, interval_range
3.1from_breaks的功能类似于cut或qcut函数,只不过后两个是通过计算得到的风格点,而前者是直接传入自定义的分割点:
pd.IntervalIndex.from_breaks([1,3,6,10], closed=‘both’)
3.2from_arrays是分别传入左端点和右端点的列表,适用于有交集并且知道起点和终点的情况:
pd.IntervalIndex.from_arrays(left = [1,3,6,10], right = [5,4,9,11], closed = ‘neither’)
3.3from_arrays是分别传入左端点和右端点的列表,适用于有交集并且知道起点和终点的情况:
pd.IntervalIndex.from_arrays(left = [1,3,6,10], right = [5,4,9,11], closed = ‘neither’)
3.4from_tuples传入的是起点和终点元组构成的列表:
pd.IntervalIndex.from_tuples([(1,5),(3,4),(6,9),(10,11)], closed=‘neither’)
3.区间的属性与方法
ontains和overlaps,分别指逐个判断每个区间是否包含某元素,以及是否和一个pd.Interval对象有交集.
id_demo.contains(4)
id_demo.overlaps(pd.Interval(40,60))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值