Pandas数据分析学习打卡(三):Category分类数据
主要内容:
对于分类数据,我的理解是,实际中会存在一类数据,它的类别是固定的,只有几种或者分为几个档次,然后pandas中的分类数据就是为此而存在。
它的创建有好几种方法,可以pandas对象的创建中将dtype指定为“category”,也可以利用内置Categorical类型创建,或者利用cut函数创建:
pd.Series([\"a\", \"b\", \"c\", \"a\"], dtype=\"category\")cat = pd.Categorical([\"a\", \"b\", \"c\", \"a\"], categories=[\'a\',\'b\',\'c\'])pd.cut(np.random.randint(0,60,5), [0,10,30,60])
在打印创建好的Category数据时,会返回一个Categories信息,显示有哪些类别,类似于unique函数返回结果吧,用set_categories可以修改这个类别,但是不改变值,导致在类别中不存在的值会直接变成NaN,用rename_categories修改的话,它会同步修改值。同时还有其它操作:
利用add_categories添加;利用remove_categories移除;remove_unused_categories删除元素值未出现的分类类型。
分类数据类型被分为有序和无序,可以利用as_ordered方法将一个序列转为有序变量,而要退化为无序变量的话就使用as_unordered,或者利用set_categories方法中的order参数,令其等于True。reorder_categories方法也可以实现有序化,但是它新设置的分类必须与原分类为同一集合。然后是排序操作,这里没有新的方法,应该就是用Python内置的值排序和索引排序。
最后是分类变量的比较操作,用==、>=、<=、<、>,返回布尔序列,可以与标量或等长序列的比较,与另一分类变量的比较。
问题与练习:
【问题一】 如何使用union_categoricals方法?它的作用是什么?
【问题二】 利用concat方法将两个序列纵向拼接,它的结果一定是分类变量吗?什么情况下不是?
回答:这里把问题一 和问题二连起来回答:
首先,利用concat方法将两个序列纵向拼接,它的结果不一定是分类变量:
当类别不一样时:
import pandas as pdblood_type1 = pd.Categorical([\"A\", \"AB\"])blood_type2 = pd.Categorical([\"B\", \"O\"])print(pd.concat([pd.Series(blood_type1), pd.Series(blood_type2)]))
拼接后返回的结果是object
当类别一样的时候:
import pandas as pdblood_type1 = pd.Categorical([\"A\", \"AB\"], categories=[\"A\", \"AB\", \"B\", \"O\"])blood_type2 = pd.Categorical([\"B\", \"O\"], categories=[\"A\", \"AB\", \"B\", \"O\"])print(pd.concat([pd.Series(blood_type1), pd.Series(blood_type2)]))
拼接后返回的结果是category
所以我推测,需要两个序列的类别一样,拼出来才能保持category。
不过,也可以用可以借助 union_categoricals 来完成,这就是它的作用,使用方法如下(需要这么调用:pd.api.types.union_categoricals):
import pandas as pdblood_type1 = pd.Categorical([\"A\", \"AB\"])blood_type2 = pd.Categorical([\"B\", \"O\"])print(pd.Series(pd.api.types.union_categoricals([blood_type1, blood_type2])))
【问题三】 当使用groupby方法或者value_counts方法时,分类变量的统计结果和普通变量有什么区别?
**回答:**因为没学pandas上,groupby用的不熟,试了一遍,然后还看了看队长的结果,似乎没啥区别?
【问题四】 下面的代码说明了Series创建分类变量的什么“缺陷”?如何避免?(提示:使用Series中的copy参数)
**回答:**从结果看,是改变序列的值得时候,类别没有跟着改。
【练习一】 现继续使用第四章中的地震数据集,请解决以下问题:
(a)现在将深度分为七个等级:[0,5,10,15,20,30,50,np.inf],请以深度等级Ⅰ,Ⅱ,Ⅲ,Ⅳ,Ⅴ,Ⅵ,Ⅶ为索引并按照由浅到深的顺序进行排序。
import pandas as pdimport numpy as npdf = pd.read_csv(\'joyful-pandas-master/data/Earthquake.csv\')df[\'深度\'] = pd.cut(df[\'深度\'], [0, 5, 10, 15, 20, 30, 50, np.inf],\\labels=[\'Ⅰ\', \'Ⅱ\', \'Ⅲ\', \'Ⅳ\', \'Ⅴ\', \'Ⅵ\', \'Ⅶ\'],\\right=False)print(df.sort_values(\'深度\'))
(b)在(a)的基础上,将烈度分为4个等级:[0,3,4,5,np.inf],依次对南部地区的深度和烈度等级建立多级索引排序。
import pandas as pdimport numpy as npdf = pd.read_csv(\'joyful-pandas-master/data/Earthquake.csv\')df[\'深度\'] = pd.cut(df[\'深度\'], [0, 5, 10, 15, 20, 30, 50, np.inf],\\labels=[\'Ⅰ\', \'Ⅱ\', \'Ⅲ\', \'Ⅳ\', \'Ⅴ\', \'Ⅵ\', \'Ⅶ\'],\\right=False)print(df.sort_values(\'深度\'))df[\'烈度\'] = pd.cut(df[\'烈度\'], [0, 3, 4, 5, np.inf], right=False)print(df.set_index([\'深度\', \'烈度\']))
【练习二】 对于分类变量而言,调用第4章中的变形函数会出现一个BUG(目前的版本下还未修复):例如对于crosstab函数,按照官方文档的说法,即使没有出现的变量也会在变形后的汇总结果中出现,但事实上并不是这样,比如下面的例子就缺少了原本应该出现的行’c’和列’f’。基于这一问题,请尝试设计my_crosstab函数,在功能上能够返回正确的结果。
foo = pd.Categorical([\'a\', \'b\'], categories=[\'a\', \'b\', \'c\'])bar = pd.Categorical([\'d\', \'e\'], categories=[\'d\', \'e\', \'f\'])pd.crosstab(foo, bar)
今天事情有点多,加上这一次打卡时间只有一天,而且对pandas上的内容不太熟悉,所以这次的练习二只能放过,抱歉…