首页 > 编程知识 正文

pandas 中 Category 的应用,pandas高级应用

时间:2023-05-03 23:03:51 阅读:213095 作者:4497

Categoricals 是 pandas 的一种数据类型,对应着被统计的变量。Categoricals 是由固定的且有限数量的变量组成的。比如:性别、社会阶层、血型、国籍、观察时段、赞美程度等等。

与其它被统计的变量相比,categorical 类型的数据可以具有特定的顺序——比如:按程度来设定,“强烈同意”与“同意”,“首次观察”与“二次观察”,但是不能做按数值来进行排序操作(比如:sort_by 之类的,换句话说,categorical 的顺序是创建时手工设定的,是静态的)

类型数据的每一个元素的值要么是预设好的类型中的某一个,要么是空值(np.nan)。顺序是由预设好的类型集合来决定的,而不是按照类型集合中各个元素的字母顺序排序的。categorical 实例的内部是由类型名字集合和一个整数组成的数组构成的,后者标明了类型集合真正的值。

对 Categorical 数据的一个直观认识 隐式创建 Categorical 数据

用一段代码从不同角度来展现一下 categorical 类型的数据。

# 先创建一个简单的 DataFrame 实例# Terry, Hardon, Curry, Duran, James 和 Barter 代表东西部玩三打三# 用一组数据记录各自的得分情况import pandas as pd, numpy as npplayers=['Garsol','Hardon','Bill','Duran','James','Barter']scores=[22,34,12,31,26,19]teams=['West','West','East','West','East','East']df=pd.DataFrame({'player':players,'score':scores,'team':teams})df

输出:

player score team0 Garsol 22 West1 Hardon 34 West2 Bill 12 East3 Duran 31 West4 James 26 East5 Barter 19 East

可以看出 team 这一列,其实只有两种值:East 和 West,可以将 team 列的类型设定为 category

df.team.astype('category') 0 West1 West2 East3 West4 East5 EastName: team, dtype: categoryCategories (2, object): [East, West]

可以看到,df.team 的变量类型变成了 category。当然,迄今为止,这个分类是我们手工标记上去的,主动给每一个球员加上了 east 或者 west 的标记。那么,如果是动态的来添加呢?比如按照得分来划分,将高于平均分的划为 Star,低于平均分的划为 Role。计算过程就应该是这样:

d=pd.Series(scores).describe()score_ranges=[d['min']-1,d['mean'],d['max']+1]score_labels=['Role','Star']# 用pd.cut(ori_data, bins, labels) 方法# 以 bins 设定的画界点来将 ori_data 归类,然后用 labels 中对应的 label 来作为分类名df['level']=pd.cut(df['score'],score_ranges,labels=score_labels)print 'df :'print dfprint 'n对比一下 Category 类型的数据和普通的 DataFrame中的列有什么区别'print 'ndf['team'] 是普通的 DataFrame列'print df['team']print 'ndf['level'] 是 Category 类型的'print df['level']print 'n可以看出 df['level'] 有点像是集合,输出信息会去重后列出组成元素'print df['level'].get_values() df : player score team level0 Garsol 22 West Role1 Hardon 34 West Star2 Bill 12 East Role3 Duran 31 West Star4 James 26 East Star5 Barter 19 East Role对比一下 Category 类型的数据和普通的 DataFrame中的列有什么区别df['team'] 是普通的 DataFrame列0 West1 West2 East3 West4 East5 EastName: team, dtype: objectdf['level'] 是 Category 类型的0 Role1 Star2 Role3 Star4 Star5 RoleName: level, dtype: categoryCategories (2, object): [Role < Star]可以看出 df['level'] 有点像是集合,输出信息会去重后列出组成元素['Role' 'Star' 'Role' 'Star' 'Star' 'Role'] 显式创建 Categorical 数据 cg=pd.Categorical(['Role','Role','Star','Role','Killer','Star'],categories=['Role', 'Star'])cg [Role, Role, Star, Role, NaN, Star]Categories (2, object): [Role, Star]

可以看到,构造方法中第二个参数是指定了实例中可以包含的元素,在第一个参数中的元素如果不在 categories 中,就会被转成NaN。
Categorical 实例可以转为 Series,被称为 categorical series

s=pd.Series(cg)s 0 Role1 Role2 Star3 Role4 NaN5 Stardtype: categoryCategories (2, object): [Role, Star]

也可以将 categorical 实例加入到 dataframe 实例的某一列中,被称为 categorical dataframe column:

df=pd.DataFrame({'players':['Garsol','Hardon','Bill','Duran','James','Barter']})df['level']=cgprint df['level'],'nn',df.dtypes 0 Role1 Role2 Star3 Role4 NaN5 StarName: level, dtype: categoryCategories (2, object): [Role, Star] players objectlevel categorydtype: object

作者:那未必
链接:https://www.jianshu.com/p/20169d7f60bc
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。