Pandas 数据编码的十种方法


Posted in Python onApril 20, 2022

大家好,我是早起。

最近在知乎上看到这样一个问题

Pandas 数据编码的十种方法

题主表示pandas用起来很乱,事实真的如此吗?本文就将先如何利用pandas来行数据转换/编码的十种方案,最后再回答这个问题。

其实这个操作在机器学习中十分常见,很多算法都需要我们对分类特征进行转换(编码),即根据某一列的值,新增(修改)一列。

为了方便理解,下面创建示例DataFrame

Pandas 数据编码的十种方法

数值型数据

让我们先来讨论连续型数据的转换,也就是根据Score列的值,来新增一列标签,即如果分数大于90,则标记为A,分数在80-90标记为B,以此类推。

自定义函数 + 循环遍历

首先当然是最简单,最笨的方法,自己写一个函数,并用循环遍历,那肯定就是一个def加一个for

df1 = df.copy()

def myfun(x):
    if x>90:
        return 'A'
    elif x>=80 and x<90:
        return 'B'
    elif x>=70 and x<80:
        return 'C'
    elif x>=60 and x<70:
        return 'D'
    else:
        return 'E'
    
df1['Score_Label'] = None
for i in range(len(df1)):
    df1.iloc[i,3] = myfun(df1.iloc[i,2])

这段代码,相信所有人都能看懂,简单好想但比较麻

Pandas 数据编码的十种方法

有没有更简单的办法呢?pandas当然提供了很多高效的操作的函数,继续往下看。

自定义函数 + map

现在,可以使用map来干掉循环(虽然本质上也是循环)

df2 = df.copy()

def mapfun(x):
    if x>90:
        return 'A'
    elif x>=80 and x<90:
        return 'B'
    elif x>=70 and x<80:
        return 'C'
    elif x>=60 and x<70:
        return 'D'
    else:
        return 'E'

df2['Score_Label'] = df2['Score'].map(mapfun)

结果是同样的

Pandas 数据编码的十种方法

自定义函数 + apply

如果还想简洁代码,可以使用自定义函数 + apply来干掉自定义函数

df3 = df.copy()
df3['Score_Label'] = df3['Score'].apply(lambda x: 'A' if x > 90 else (
    'B' if 90 > x >= 80 else ('C' if 80 > x >= 70 else ('D' if 70 > x >= 60 else 'E'))))

结果和上面是一致的,只不过这么写容易被打。

使用 pd.cut

现在,让我们继续了解更高级的pandas函数,依旧是对 Score 进行编码,使用pd.cut,并指定划分的区间后,可以直接帮你分好组

df4 = df.copy()
bins = [0, 59, 70, 80, 100]
df4['Score_Label'] = pd.cut(df4['Score'], bins)

Pandas 数据编码的十种方法

也可以直接使用labels参数来修改对应组的名称,是不是方便多了

df4['Score_Label_new'] = pd.cut(df4['Score'], bins, labels=[
                                'low', 'middle', 'good', 'perfect'])

Pandas 数据编码的十种方法

使用 sklearn 二值化

既然是和机器学习相关,sklearn肯定跑不掉,如果需要新增一列并判定成绩是否及格,就可以使用Binarizer函数,代码也是简洁好懂

df5 = df.copy()
binerize = Binarizer(threshold = 60)
trans = binerize.fit_transform(np.array(df1['Score']).reshape(-1,1))
df5['Score_Label'] = trans

Pandas 数据编码的十种方法

文本型数据

下面介绍更常见的,对文本数据进行转换打标签。例如新增一列,将性别男、女分别标记为0、1

使用 replace

首先介绍replace,但要注意的是,上面说过的自定义函数相关方法依旧是可行的

df6 = df.copy()
df6['Sex_Label'] = df6['Sex'].replace(['Male','Female'],[0,1])

Pandas 数据编码的十种方法

上面是对性别操作,因为只有男女,所以可以手动指定0、1,但要是类别很多,也可以使用pd.value_counts()来自动指定标签,例如对Course Name列分组

df6 = df.copy()
value = df6['Course Name'].value_counts()
value_map = dict((v, i) for i,v in enumerate(value.index))
df6['Course Name_Label'] = df6.replace({'Course Name':value_map})['Course Name']

Pandas 数据编码的十种方法

使用map

额外强调的是,新增一列,一定要能够想到map

df7 = df.copy()
Map = {elem:index for index,elem in enumerate(set(df["Course Name"]))}
df7['Course Name_Label'] = df7['Course Name'].map(Map)

Pandas 数据编码的十种方法

使用astype

这个方法应该很多人不知道,这就属于上面提到的知乎问题,能实现的方法太多了

df8 = df.copy()
value = df8['Course Name'].astype('category')
df8['Course Name_Label'] = value.cat.codes

Pandas 数据编码的十种方法

使用 sklearn

同数值型一样,这种机器学习中的经典操作,sklearn一定有办法,使用LabelEncoder可以对分类数据进行编码

from sklearn.preprocessing import LabelEncoder
df9 = df.copy()
le = LabelEncoder()
le.fit(df9['Sex'])
df9['Sex_Label'] = le.transform(df9['Sex'])
le.fit(df9['Course Name'])
df9['Course Name_Label'] = le.transform(df9['Course Name'])

Pandas 数据编码的十种方法

一次性转换两列也是可以的

df9 = df.copy()
le = OrdinalEncoder()
le.fit(df9[['Sex','Course Name']])
df9[['Sex_Label','Course Name_Label']] = le.transform(df9[['Sex','Course Name']])

使用factorize

最后,再介绍一个小众但好用的pandas方法,我们需要注意到,在上面的方法中,自动生成的Course Name_Label列,虽然一个数据对应一个语言,因为避免写自定义函数或者字典,这样可以自动生成,所以大多是无序的。

如果我们希望它是有序的,也就是 Python 对应 0Java对应1,除了自己指定,还有什么优雅的办法?这时可以使用factorize,它会根据出现顺序进行编码

df10 = df.copy()
df10['Course Name_Label'] = pd.factorize(df10['Course Name'])[0]

Pandas 数据编码的十种方法

结合匿名函数,我们可以做到对多列进行有序编码转换

df10 = df.copy()
cat_columns = df10.select_dtypes(['object']).columns

df10[['Sex_Label', 'Course Name_Label']] = df10[cat_columns].apply(
    lambda x: pd.factorize(x)[0])

Pandas 数据编码的十种方法

总结

至此,我要介绍的十种pandas数据编码的方法就分享完毕,代码拿走修改变量名就能用

现在回到文章开头的问题,如果你觉得pandas用起来很乱,说明你可能还未对pandas有一个全面且彻底的了解。

其实就像本文介绍数据编码转换一样,确实有很多方法可以实现显得很乱,但学习pandas的正确姿势就是应该把它当成字典来学,不必记住所有方法与细节,你只需知道有这么个函数能完成这样操作,需要用时能想到,想到再来查就行。

以上就是Pandas进行数据编码的十种方式总结的详细内容!

Python 相关文章推荐
python 控制语句
Nov 03 Python
Python彩色化Linux的命令行终端界面的代码实例分享
Jul 02 Python
python微信跳一跳系列之棋子定位像素遍历
Feb 26 Python
Django 根据数据模型models创建数据表的实例
May 27 Python
解决Pycharm运行时找不到文件的问题
Oct 29 Python
Python格式化输出字符串方法小结【%与format】
Oct 29 Python
Face++ API实现手势识别系统设计
Nov 21 Python
Python理解递归的方法总结
Jan 28 Python
Python中的四种交换数值的方法解析
Nov 18 Python
在keras中获取某一层上的feature map实例
Jan 24 Python
python爬虫库scrapy简单使用实例详解
Feb 10 Python
python使用梯度下降和牛顿法寻找Rosenbrock函数最小值实例
Apr 02 Python
Python读取和写入Excel数据
Python 的演示平台支持 WSGI 接口的应用
Apr 20 #Python
python​格式化字符串
Apr 20 #Python
Python编写冷笑话生成器
Apr 20 #Python
Python Django / Flask如何使用Elasticsearch
Apr 19 #Python
python中mongodb包操作数据库
Apr 19 #Python
Elasticsearch 聚合查询和排序
Apr 19 #Python
You might like
PHP开发大型项目的一点经验
2006/10/09 PHP
php中将地址生成迅雷快车旋风链接的代码[测试通过]
2011/04/20 PHP
thinkphp3.x中session方法的用法分析
2016/05/20 PHP
php插入含有特殊符号数据的处理方法
2016/11/24 PHP
利用phpexcel对数据库数据的导入excel(excel筛选)、导出excel
2017/04/27 PHP
PHP mongodb操作类定义与用法示例【适合mongodb2.x和mongodb3.x】
2018/06/16 PHP
PHP实现的多维数组去重操作示例
2018/07/21 PHP
Yii 实现数据加密和解密
2021/03/09 PHP
jquery 插件开发 extjs中的extend用法小结
2013/01/04 Javascript
jquery查找父元素、子元素(个人经验总结)
2014/04/09 Javascript
tuzhu_req.js 实现仿百度图片首页效果
2015/08/11 Javascript
基于Bootstrap的UI扩展 StyleBootstrap
2016/06/17 Javascript
Angularjs的启动过程分析
2017/07/18 Javascript
详解Vue双向数据绑定原理解析
2017/09/11 Javascript
js实现会跳动的日历效果(完整实例)
2017/10/18 Javascript
element-ui表格数据转换的示例代码
2018/08/24 Javascript
jQuery.validate.js表单验证插件的使用代码详解
2018/10/22 jQuery
vue模式history下在iis中配置流程
2019/04/17 Javascript
AutoJs实现刷宝短视频的思路详解
2020/05/22 Javascript
ES6学习教程之Promise用法详解
2020/11/22 Javascript
Vue如何跨组件传递Slot的实现
2020/12/14 Vue.js
[36:52]DOTA2真视界:基辅特锦赛总决赛
2017/05/21 DOTA
总结网络IO模型与select模型的Python实例讲解
2016/06/27 Python
python字符串,数值计算
2016/10/05 Python
一个月入门Python爬虫学习,轻松爬取大规模数据
2018/01/03 Python
python更改已存在excel文件的方法
2018/05/03 Python
解决python爬虫中有中文的url问题
2018/05/11 Python
python调用c++ ctype list传数组或者返回数组的方法
2019/02/13 Python
Python操控mysql批量插入数据的实现方法
2020/10/27 Python
美国殿堂级滑板、冲浪、滑雪服装品牌:Volcom(钻石)
2017/04/20 全球购物
介绍一下SQL中union,intersect和minus
2012/04/05 面试题
构造方法和其他方法的区别
2016/04/26 面试题
公积金单位接收函
2014/01/11 职场文书
开发者首先否认《遗弃》被取消的传言
2022/04/11 其他游戏
PostgreSQL聚合函数介绍以及分组和排序
2022/04/12 PostgreSQL
python如何利用cv2.rectangle()绘制矩形框
2022/12/24 Python