Python和R中表示类别的数据类型分别是Category和factor,两者的用法十分相似。本文对两者的用法做一简单对比。
Python-Category
import pandas as pdnames = ['Carrie','Dailey','Mack','Sally','James','Pansy', 'Wall', 'Kaley', 'Kate', 'Tanya']teams = ['West', 'West', 'East', 'West', 'East', 'East', 'West', 'West', 'East', 'East']scores = [98, 87, 43, 61, 26, 51, 73, 90, 69, 82]df = pd.DataFrame({'name': names, 'team': teams, 'score': scores})
# 显示创建Category
# 无序的pd.Categorical(teams, categories=['East', 'West'])# 有序的pd.Categorical(teams, categories=['East', 'West'], ordered=True)pd.Categorical(teams, categories=['East', 'West', 'South'], ordered=True)
#.astype方法转换成category
df['team'] = df['team'].astype('category')
# pd.cut切分后转换成有序category
score_ranges = [0, 60, 90, 101]score_labels = ['不及格', '中等', '优秀']df['level'] = pd.cut(df['score'], bins=score_ranges, labels=score_labels, right=False)
#.cat.rename_categories 重命名类别标签
# 显示设置原名称和新名称一一对应df['level'].cat.rename_categories({'不及格': 'very bad', '中等': 'medium', '优秀': 'very good'})# 或不显示原名称,但顺序要注意对齐df['level'].cat.rename_categories(['very bad', 'medium', 'very good'])
#.cat.categories 赋值
# 给categories赋值,可以改变类别标签。要注意赋值的时候是按照顺序进行对应的。同cat.rename_categories效果df[df['level'].cat.categories = ['very bad', 'medium', 'very good']
#.cat.reorder_categories 设置类别顺序、设置有序或无序
df['level'].cat.reorder_categories(['very good', 'very bad', 'medium'])df['level'].cat.reorder_categories(['very good', 'very bad', 'medium'], ordered=False)
#.cat.as_unordered() 有序转成无序
df['level'] = df['level'].cat.as_unordered()
#.cat.as_ordered() 无序转成有序
df['level'] = df['level'].cat.as_ordered()
#.cat.set_categories 设置类别顺序、设置有序或无序、改变类别标签集合
# 设置类别顺序、设置有序或无序 同.cat.reorder_categoriesdf['level'].cat.set_categories(['very good', 'very bad', 'medium'])df['level'].cat.set_categories(['very good', 'very bad', 'medium'], ordered=False)# 改变类别标签集合df['level'] = df['level'].cat.set_categories(['very bad', 'bad', 'medium', 'good', 'very good'])
#.cat.add_categories 添加类别
df['level'] = df['level'].cat.add_categories(['brilliant'])
#.cat.remove_categories 删除类别
df['level'] = df['level'].cat.remove_categories(['brilliant'])
#.cat.remove_unused_categories() 删除无用的类别
df['level'].cat.remove_unused_categories()
R-factor
names
#转换成因子
df$team = factor(df$team)
#cut函数切分连续变量为因子
score_ranges
#重命名因子水平
# 显示设置原名称和新名称一一对应factor(df$level, levels=c('不及格', '中等', '优秀'), labels=c('very bad', 'medium','very good'))# 或不显示原名称,但顺序要注意对齐df$level = factor(df$level, labels=c('very bad', 'medium','very good'))
#设置因子水平顺序
factor(df$level, levels=c('very good', 'very bad', 'medium'))
#有序转成无序
df$level
#无序转成有序
df$level
#改变因子水平的集合
factor(df$level, levels=c('very bad', 'bad', 'medium', 'good', 'very good'))
结语
通过上面的比较,我们发现Python中的Category和R中的factor的用法和功能基本一致。其实不仅该点相似,两种语言的很多地方都有相通点,且在发展的过程中,两者多有相互借鉴之处。所以,我们在选择工具的时候,首先要根据自己的实际情况选择其中一种深度使用,即能够使用其中一种来解决实际工作中的分析、建模等各种问题。然后如果有需要,再学另一种,会发现如果深度使用过其中一种,再迁移到另一种是很快的事。