打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
pandas中Category的应用

文章目录

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

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

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

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

对 Categorical 数据的一个直观认识

隐式创建 Categorical 数据

# 用一段代码从不同角度来展现一下 categorical 类型的数据# 先创建一个简单的 DataFrame 实例# Terry, Hardon, Curry, Duran, James 和 Barter 代表东西部玩三打三# 用一组数据记录各自的得分情况import pandas as pdimport numpy as npplayers = ['Garsol','Hardon','Bill','Duran','James','Barter']teams = ['West','West','East','West','East','East']scores = [22,34,12,31,26,19]df = pd.DataFrame({'player':players,'score':scores,'team':teams})
df
playerscoreteam
0Garsol22West
1Hardon34West
2Bill12East
3Duran31West
4James26East
5Barter19East

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

df.team
0    West1    West2    East3    West4    East5    EastName: team, dtype: object
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()d
score_ranges = [d['min']-1,d['mean'],d['max']+1]score_ranges
[11.0, 24.0, 35.0]
score_labels = ['Role','Star']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)
df['level']
0    Role1    Star2    Role3    Star4    Star5    RoleName: level, dtype: categoryCategories (2, object): [Role < Star]
print('df:')print(df)print('\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'],'\n\n',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
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
有什么特别好用的办法能在大数据处理中减少内存使用率的办法呢?
Python金融量化利器——Pandas操作手册(一)
Python 数据分析之 pandas 进阶(二)
使用Python,pandas,seaborn和scikit-Learn进行探索性数据分析
pandas.DataFrame对行和列求和及添加新行和列
Python 数据分析包:pandas 基础
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服