pandas category数据类型
pandas category数据类型
- 实际应用pandas过程中,经常会用到category数据类型,通常以string的形式显示,包括颜色(红,绿,蓝),尺寸的大小(大,中,小),还有地理信息等(国家,省份),这些数据的处理经常会有各种各样的问题,pandas以及scikit-learn两个包可以将category数据转化为合适的数值型格式,这篇主要介绍通过这两个包处理category类型的数据转化为数值类型,也就是encoding的过程。
- 数据来源UCI Machine Learning Repository,这个数据集中包含了很多的category类型的数据,可以从链接汇总查看数据的代表的含义。
- 下面开始导入需要用到的包
import numpy as np
import pandas as pd
# 规定一下数据列的各个名称,
headers = ["symboling", "normalized_losses", "make", "fuel_type", "aspiration","num_doors", "body_style", "drive_wheels", "engine_location","wheel_base", "length", "width", "height", "curb_weight","engine_type", "num_cylinders", "engine_size", "fuel_system","bore", "stroke", "compression_ratio", "horsepower", "peak_rpm","city_mpg", "highway_mpg", "price"]
# 从pandas导入csv文件,将?标记为NaN缺失值
df=pd.read_csv("http://mlr.cs.umass.edu/ml/machine-learning-databases/autos/imports-85.data",header=None,names=headers,na_values="?")
df.head()
symboling | normalized_losses | make | fuel_type | aspiration | num_doors | body_style | drive_wheels | engine_location | wheel_base | ... | engine_size | fuel_system | bore | stroke | compression_ratio | horsepower | peak_rpm | city_mpg | highway_mpg | price | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 3 | NaN | alfa-romero | gas | std | two | convertible | rwd | front | 88.6 | ... | 130 | mpfi | 3.47 | 2.68 | 9.0 | 111.0 | 5000.0 | 21 | 27 | 13495.0 |
1 | 3 | NaN | alfa-romero | gas | std | two | convertible | rwd | front | 88.6 | ... | 130 | mpfi | 3.47 | 2.68 | 9.0 | 111.0 | 5000.0 | 21 | 27 | 16500.0 |
2 | 1 | NaN | alfa-romero | gas | std | two | hatchback | rwd | front | 94.5 | ... | 152 | mpfi | 2.68 | 3.47 | 9.0 | 154.0 | 5000.0 | 19 | 26 | 16500.0 |
3 | 2 | 164.0 | audi | gas | std | four | sedan | fwd | front | 99.8 | ... | 109 | mpfi | 3.19 | 3.40 | 10.0 | 102.0 | 5500.0 | 24 | 30 | 13950.0 |
4 | 2 | 164.0 | audi | gas | std | four | sedan | 4wd | front | 99.4 | ... | 136 | mpfi | 3.19 | 3.40 | 8.0 | 115.0 | 5500.0 | 18 | 22 | 17450.0 |
5 rows × 26 columns
df.dtypes
symboling int64
normalized_losses float64
make object
fuel_type object
aspiration object
num_doors object
body_style object
drive_wheels object
engine_location object
wheel_base float64
length float64
width float64
height float64
curb_weight int64
engine_type object
num_cylinders object
engine_size int64
fuel_system object
bore float64
stroke float64
compression_ratio float64
horsepower float64
peak_rpm float64
city_mpg int64
highway_mpg int64
price float64
dtype: object
# 如果只关注category 类型的数据,其实根本没有必要拿到这些全部数据,只需要将object类型的数据取出,然后进行后续分析即可
obj_df = df.select_dtypes(include=['object']).copy()
obj_df.head()
make | fuel_type | aspiration | num_doors | body_style | drive_wheels | engine_location | engine_type | num_cylinders | fuel_system | |
---|---|---|---|---|---|---|---|---|---|---|
0 | alfa-romero | gas | std | two | convertible | rwd | front | dohc | four | mpfi |
1 | alfa-romero | gas | std | two | convertible | rwd | front | dohc | four | mpfi |
2 | alfa-romero | gas | std | two | hatchback | rwd | front | ohcv | six | mpfi |
3 | audi | gas | std | four | sedan | fwd | front | ohc | four | mpfi |
4 | audi | gas | std | four | sedan | 4wd | front | ohc | five | mpfi |
# 在进行下一步处理的之前,需要将数据进行缺失值的处理,对列进行处理axis=1
obj_df[obj_df.isnull().any(axis=1)]
make | fuel_type | aspiration | num_doors | body_style | drive_wheels | engine_location | engine_type | num_cylinders | fuel_system | |
---|---|---|---|---|---|---|---|---|---|---|
27 | dodge | gas | turbo | NaN | sedan | fwd | front | ohc | four | mpfi |
63 | mazda | diesel | std | NaN | sedan | fwd | front | ohc | four | idi |
# 处理缺失值的方式有很多种,根据项目的不同或者填补缺失值或者去掉该样本。本文中的数据缺失用该列的众数来补充。
obj_df.num_doors.value_counts()
four 114
two 89
Name: num_doors, dtype: int64
obj_df=obj_df.fillna({"num_doors":"four"})
在处理完缺失值之后,有以下几种方式进行category数据转化encoding
- Find and Replace
- label encoding
- One Hot encoding
- Custom Binary encoding
- sklearn
- advanced Approaches
# pandas里面的replace文档非常丰富,笔者在使用该功能时候,深感其参数众多,深感提供的功能也非常的强大
# 本文中使用replace的功能,创建map的字典,针对需要数据清理的列进行清理更加方便,例如:
cleanup_nums= {"num_doors":{"four":4,"two":2},"num_cylinders":{"four":4,"six":6,"five":5,"eight":8,"two":2,"twelve":12,"three":3}
}
obj_df.replace(cleanup_nums,inplace=True)
obj_df.head()
make | fuel_type | aspiration | num_doors | body_style | drive_wheels | engine_location | engine_type | num_cylinders | fuel_system | |
---|---|---|---|---|---|---|---|---|---|---|
0 | alfa-romero | gas | std | 2 | convertible | rwd | front | dohc | 4 | mpfi |
1 | alfa-romero | gas | std | 2 | convertible | rwd | front | dohc | 4 | mpfi |
2 | alfa-romero | gas | std | 2 | hatchback | rwd | front | ohcv | 6 | mpfi |
3 | audi | gas | std | 4 | sedan | fwd | front | ohc | 4 | mpfi |
4 | audi | gas | std | 4 | sedan | 4wd | front | ohc | 5 | mpfi |
label encoding 是将一组无规则的,没有大小比较的数据转化为数字
- 比如body_style 字段中含有多个数据值,可以使用该方法将其转化
- convertible > 0
- hardtop > 1
- hatchback > 2
- sedan > 3
- wagon > 4
这种方式就像是密码编码一样,这,个比喻很有意思,就像之前看电影,记得一句台词,他们俩亲密的像做贼一样
# 通过pandas里面的 category数据类型,可以很方便的或者该编码
obj_df["body_style"]=obj_df["body_style"].astype("category")
obj_df.dtypes
make object
fuel_type object
aspiration object
num_doors int64
body_style category
drive_wheels object
engine_location object
engine_type object
num_cylinders int64
fuel_system object
dtype: object
# 我们可以通过赋值新的列,保存其对应的code
# 通过这种方法可以舒服的数据,便于以后的数据分析以及整理
obj_df["body_style_code"] = obj_df["body_style"].cat.codes
obj_df.head()
make | fuel_type | aspiration | num_doors | body_style | drive_wheels | engine_location | engine_type | num_cylinders | fuel_system | body_style_code | |
---|---|---|---|---|---|---|---|---|---|---|---|
0 | alfa-romero | gas | std | 2 | convertible | rwd | front | dohc | 4 | mpfi | 0 |
1 | alfa-romero | gas | std | 2 | convertible | rwd | front | dohc | 4 | mpfi | 0 |
2 | alfa-romero | gas | std | 2 | hatchback | rwd | front | ohcv | 6 | mpfi | 2 |
3 | audi | gas | std | 4 | sedan | fwd | front | ohc | 4 | mpfi | 3 |
4 | audi | gas | std | 4 | sedan | 4wd | front | ohc | 5 | mpfi | 3 |
one hot encoding
- label encoding 因为将wagon转化为4,而convertible变成了0,这里面是不是会有大大小的比较,可能会造成误解,然后利用one hot encoding这种方式
是将特征转化为0或者1,这样会增加数据的列的数量,同时也减少了label encoding造成的衡量数据大小的误解。 - pandas中提供了get_dummies 方法可以将需要转化的列的值转化为0,1,两种编码
# 新生成DataFrame包含了新生成的三列数据,
# drive_wheels_4wd
# drive_wheels_fwd
# drive_wheels_rwd
pd.get_dummies(obj_df,columns=["drive_wheels"]).head()
make | fuel_type | aspiration | num_doors | body_style | engine_location | engine_type | num_cylinders | fuel_system | body_style_code | drive_wheels_4wd | drive_wheels_fwd | drive_wheels_rwd | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | alfa-romero | gas | std | 2 | convertible | front | dohc | 4 | mpfi | 0 | 0 | 0 | 1 |
1 | alfa-romero | gas | std | 2 | convertible | front | dohc | 4 | mpfi | 0 | 0 | 0 | 1 |
2 | alfa-romero | gas | std | 2 | hatchback | front | ohcv | 6 | mpfi | 2 | 0 | 0 | 1 |
3 | audi | gas | std | 4 | sedan | front | ohc | 4 | mpfi | 3 | 0 | 1 | 0 |
4 | audi | gas | std | 4 | sedan | front | ohc | 5 | mpfi | 3 | 1 | 0 | 0 |
# 该方法之所以强大,是因为可以同时处理多个category的列,同时选择prefix前缀分别对应好
# 产生的新的DataFrame所有数据都包含
pd.get_dummies(obj_df, columns=["body_style", "drive_wheels"], prefix=["body", "drive"]).head()
make | fuel_type | aspiration | num_doors | engine_location | engine_type | num_cylinders | fuel_system | body_style_code | body_convertible | body_hardtop | body_hatchback | body_sedan | body_wagon | drive_4wd | drive_fwd | drive_rwd | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | alfa-romero | gas | std | 2 | front | dohc | 4 | mpfi | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
1 | alfa-romero | gas | std | 2 | front | dohc | 4 | mpfi | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
2 | alfa-romero | gas | std | 2 | front | ohcv | 6 | mpfi | 2 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 1 |
3 | audi | gas | std | 4 | front | ohc | 4 | mpfi | 3 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 |
4 | audi | gas | std | 4 | front | ohc | 5 | mpfi | 3 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 0 |
自定义0,1 encoding
- 有的时候回根据业务需要,可能会结合label encoding以及not hot 两种方式进行二值化。
obj_df["engine_type"].value_counts()
ohc 148
ohcf 15
ohcv 13
dohc 12
l 12
rotor 4
dohcv 1
Name: engine_type, dtype: int64
# 有的时候为了区分出 engine_type是否是och技术的,可以使用二值化,将该列进行处理
# 这也突出了领域知识是如何以最有效的方式解决问题
obj_df["engine_type_code"] = np.where(obj_df["engine_type"].str.contains("ohc"),1,0)
obj_df[["make","engine_type","engine_type_code"]].head()
make | engine_type | engine_type_code | |
---|---|---|---|
0 | alfa-romero | dohc | 1 |
1 | alfa-romero | dohc | 1 |
2 | alfa-romero | ohcv | 1 |
3 | audi | ohc | 1 |
4 | audi | ohc | 1 |
scikit-learn中的数据转化
- sklearn.processing模块提供了很多方便的数据转化以及缺失值处理方式(Imputer),可以直接从该模块导入LabelEncoder,LabelBinarizer,0,1归一化(最大最小标准化),Normalizer正则化(L1,L2)一般用的不多,标准化(最大最小标准化max_mix),非线性转换,生成多项式特征(PolynomialFeatures),将每个特征缩放在同样的范围或分布情况下
- sklearn processing 模块官网文档链接
- category_encoders包官方文档
至此,数据预处理以及category转化大致讲完了。
posted on 2018-08-02 15:53 多一点 阅读(...) 评论(...) 编辑 收藏
pandas category数据类型相关推荐
- 【python学习】category数据类型
Pandas高级教程之:category数据类型_flydean程序那些事的博客-CSDN博客_pandas category类型 pandas 中 Category 的应用_mengenqing的博 ...
- Python之pandas:数据类型变换之object、category、bool、int32、int64、float64以及数据类型标准化之详细攻略
Python之pandas:数据类型变换之object.category.bool.int32.int64.float64以及数据类型标准化之详细攻略 目录 数据类型变换之object.categor ...
- pandas根据数据类型筛选数据
pandas根据数据类型筛选数据 pandas根据数据类型筛选对应的特征列,因为不同的数据类型列往往对应不同的后续特征处理方法. select_dtypes是我们使用的主要函数,其中包含两个核心参数, ...
- python中的numpy模块和pandas模块的区别_python的numpy模块- 01.pandas基本数据类型
01.pandas基本数据类型 import pandas as pd import numpy as np from pandas import Series,DataFrame 1. Series ...
- Pandas高级教程之:category数据类型
文章目录 简介 创建category 使用Series创建 使用DF创建 创建控制 转换为原始类型 categories的操作 获取category的属性 重命名categories 使用**add_ ...
- Pandas dtypes(数据类型)
http://pandas.pydata.org/pandas-docs/stable/basics.html?highlight=astype#selecting-columns-based-on- ...
- pandas修改数据类型_如何正确在pandas里使用inplace参数
在本篇中,我们来简单介绍一下inpalce参数以及使用. 在pandas 中 ,inplace 参数在很多函数中都会有,它的作用是:是否在原对象基础上进行修改 inplace = True:不创建 ...
- [kr] pandas category类型数据使用groupby出现的问题
今天在对数据groupby的时候莫名其妙返回一些全是nan的row,百思不得其解,只能暂时用dropna处理.但后续处理使用map把分数据贴回主数据时出现报错TypeError: Cannot set ...
- python特征数据类型及常用操作对比_更高效的利用Jupyter+pandas进行数据分析,6种常用数据格式效率对比!...
在使用Python进行数据分析时,Jupyter Notebook是一个非常强力的工具,在数据集不是很大的情况下,我们可以使用pandas轻松对txt或csv等纯文本格式数据进行读写. 然而当数据集的 ...
- 整理了 25 个 Pandas 实用技巧,拿走不谢!
来源:机器学习算法与Python学习 本文约2639字,建议阅读6分钟. 本文一共为大家分享25个pandas技巧. 显示已安装的版本 输入下面的命令查询pandas版本: 1In [7]:pd.__ ...
最新文章
- 阿里90后工程师利用ARM硬件特性开启安卓8终端“上帝模式” 1
- 【CSS】CSS前期回顾(2)
- 被替换的项目不是替换值长度的倍数_面试官,为啥HashMap的长度是2的n次方?
- Oracle入门(三)之连接与登录
- 【洛谷P3389】【模板】高斯消元
- oracle 存储中文 u码,Oracle 汉字 占位
- 微软托管服务器,微软 GitHub 推出新政策,允许托管以安全研究为目的的恶意软件...
- 中国移动开通eSIM 一号双终端将要取代传统SIM卡?
- react-redux-store
- C# 构造函数base()实例演示
- java 浅堆 深堆_【深入浅出-JVM】(57):深堆、浅堆
- 能使用firebug的火狐浏览器下载地址
- 卫星定位领域相关基础知识汇总
- php地图找房代码,腾讯地图实现地图找房功能
- Cisco:DHCP自动获取IP地址
- Android混淆那些事儿
- mapbox 绘制路线并展示路线长度
- ipad键盘使用快捷键_每个iPad使用者都应该知道的20个键盘快捷键
- uboot启动之BL2阶段的分析1:宏观分析
- Mysql中B树与B+树的区别
热门文章
- docker应用篇(6):安装Uptime Kuma监控
- PoE供电技术与应用
- Cocoa动画编程指南
- RJ11电话线水晶头制作方法(图解)
- c语言转义字符o用法,gogo体育下载官网-gogo体育下载官网
- mmdetection(2): DeformableConvNets(DCN)
- SOFA BOLT源码解析之设计要点-网络IO
- 2022-07微软漏洞通告
- Bert源代码(二)模型
- 【Opencv实战】美颜模式,开启:美颜功能都这么强大了嘛?(群魔乱舞.jpg)