0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

十种pandas数据编码的方法分享

数据分析与开发 来源:早起Python 作者:刘早起 2022-05-10 15:33 次阅读

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

9a4ba882-cf81-11ec-bce3-dac502259ad0.png

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

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

为了方便理解,下面创建示例DataFrame
9a5ee8de-cf81-11ec-bce3-dac502259ad0.png

数值型数据

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

自定义函数 + 循环遍历

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

df1=df.copy()

defmyfun(x):
ifx>90:
return'A'
elifx>=80andx<90:
        return'B'
elifx>=70andx<80:
        return'C'
elifx>=60andx<70:
        return'D'
else:
return'E'

df1['Score_Label']=None
foriinrange(len(df1)):
df1.iloc[i,3]=myfun(df1.iloc[i,2])

这段代码,相信所有人都能看懂,简单好想但比较麻烦
9a734c5c-cf81-11ec-bce3-dac502259ad0.png

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

自定义函数 + map

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

df2=df.copy()

defmapfun(x):
ifx>90:
return'A'
elifx>=80andx<90:
        return'B'
elifx>=70andx<80:
        return'C'
elifx>=60andx<70:
        return'D'
else:
return'E'

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

结果是同样的
9a734c5c-cf81-11ec-bce3-dac502259ad0.png

自定义函数 + apply

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

df3=df.copy()
df3['Score_Label']=df3['Score'].apply(lambdax:'A'ifx>90else(
'B'if90>x>=80else('C'if80>x>=70else('D'if70>x>=60else'E'))))

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

使用 pd.cut

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

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

9a9422ba-cf81-11ec-bce3-dac502259ad0.png

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

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

9ae84d2c-cf81-11ec-bce3-dac502259ad0.png

使用 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

9afddcb4-cf81-11ec-bce3-dac502259ad0.png

文本型数据

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

使用 replace

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

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

9b0b4980-cf81-11ec-bce3-dac502259ad0.png

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

df6=df.copy()
value=df6['CourseName'].value_counts()
value_map=dict((v,i)fori,vinenumerate(value.index))
df6['CourseName_Label']=df6.replace({'CourseName':value_map})['CourseName']

9b1b3a66-cf81-11ec-bce3-dac502259ad0.png

使用map

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

df7=df.copy()
Map={elem:indexforindex,eleminenumerate(set(df["CourseName"]))}
df7['CourseName_Label']=df7['CourseName'].map(Map)

9b2ad944-cf81-11ec-bce3-dac502259ad0.png

使用astype

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

df8=df.copy()
value=df8['CourseName'].astype('category')
df8['CourseName_Label']=value.cat.codes

9b4a5f58-cf81-11ec-bce3-dac502259ad0.png

使用 sklearn

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

fromsklearn.preprocessingimportLabelEncoder
df9=df.copy()
le=LabelEncoder()
le.fit(df9['Sex'])
df9['Sex_Label']=le.transform(df9['Sex'])
le.fit(df9['CourseName'])
df9['CourseName_Label']=le.transform(df9['CourseName'])

9b59ed1a-cf81-11ec-bce3-dac502259ad0.png

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

df9=df.copy()
le=OrdinalEncoder()
le.fit(df9[['Sex','CourseName']])
df9[['Sex_Label','CourseName_Label']]=le.transform(df9[['Sex','CourseName']])

使用factorize

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

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

df10=df.copy()
df10['CourseName_Label']=pd.factorize(df10['CourseName'])[0]

9b8ca3ea-cf81-11ec-bce3-dac502259ad0.png

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

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

df10[['Sex_Label','CourseName_Label']]=df10[cat_columns].apply(
lambdax:pd.factorize(x)[0])

9ba5f3c2-cf81-11ec-bce3-dac502259ad0.png

总结

至此,我们要介绍的十种pandas数据编码的方法就分享完毕,代码拿走修改变量名就能用,关于这个问题如果你有更多的方法,可以在评论区进行留言~

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

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

原文标题:利用 Pandas 进行分类数据编码的十种方式!

文章出处:【微信公众号:数据分析与开发】欢迎添加关注!文章转载请注明出处。

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 编码
    +关注

    关注

    6

    文章

    935

    浏览量

    54759
  • 数据转换
    +关注

    关注

    0

    文章

    85

    浏览量

    17988
  • 函数
    +关注

    关注

    3

    文章

    4304

    浏览量

    62413

原文标题:利用 Pandas 进行分类数据编码的十种方式!

文章出处:【微信号:DBDevs,微信公众号:数据分析与开发】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    十种精密全波整流电路

    十种精密全波整流电路
    发表于 08-09 15:09

    AD转换中常用的十种数字滤波法

    AD转换中常用的十种数字滤波法
    发表于 11-17 08:38

    请问怎么做一个跑马灯有十种模式,第十种模式有三音乐,可加速减速和无线遥控?

    我现在想做一个跑马灯,这个跑马灯有十种模式,第十种模式要求有三音乐。,还得有数码管显示第几种模式。可以无线遥控。求哪位大神可以帮我。小女子必有重谢。
    发表于 07-19 04:49

    pandas数据分析的方法

    pandas数据分析中常用方法
    发表于 06-03 06:16

    十种精密全波整流电路原图分享

    十种精密全波整流电路原图,大家点评下
    发表于 11-27 06:47

    数据编码技术

    2.2  数据编码技术2.2.1  数字数据的数字信号编码2.2.2  数字数据的模拟信号编码2.2.3&nb
    发表于 06-27 21:45 0次下载

    十种方法能保护云数据安全

    十种方法能保护云数据安全
    发表于 01-14 12:00 12次下载

    基于压缩感知的无线传感器网络的数据编码方亮

    基于压缩感知的无线传感器网络的数据编码_方亮
    发表于 03-15 08:00 0次下载

    十种不同模式实现简单的计算案例

    labview作为一开发语言其实有许多不同的设计模式,大家在学习工作中接触最多当属状态机,今天我们就通过一个简单的计算案例用十种不同的模式来实现,主要带领大家了解不同编程模式之间的区别。
    的头像 发表于 10-22 11:47 2234次阅读
    <b class='flag-5'>十种</b>不同模式实现简单的计算案例

    十种复杂电路的分析方法详细说明

    电路问题计算的先决条件是正确识别电路,搞清楚各部分之间的连接关系。对较复杂的电路应先将原电路简化为等效电路,以便分析和计算。识别电路的方法很多,现结合具体实例介绍十种方法
    发表于 12-02 23:12 46次下载
    <b class='flag-5'>十种</b>复杂电路的分析<b class='flag-5'>方法</b>详细说明

    十种方法让你轻松识别复杂电路

    电路问题计算的先决条件是正确识别电路,搞清楚各部分之间的连接关系。对较复杂的电路应先将原电路简化为等效电路,以便分析和计算。识别电路的方法很多,现结合具体实例介绍十种方法
    发表于 03-18 01:40 23次下载
    <b class='flag-5'>十种方法</b>让你轻松识别复杂电路

    原电路简化为等效电路的十种方法资料下载

    电子发烧友网为你提供原电路简化为等效电路的十种方法资料下载的电子资料下载,更有其他相关的电路图、源代码、课件教程、中文资料、英文资料、参考设计、用户指南、解决方案等资料,希望可以帮助到广大的电子工程师们。
    发表于 03-29 08:40 20次下载
    原电路简化为等效电路的<b class='flag-5'>十种方法</b>资料下载

    十种变频器维修方法

    变频器维修学习方法有很多,但方向不对努力白费,所以抓住方向很重要,为了让大家更快的掌握变频器维修知识,这里提供变频器维修的十种学习方法给大家。
    发表于 11-29 16:56 4980次阅读

    十种变频器维修方法

    变频器维修学习方法有很多,但方向不对努力白费,所以抓住方向很重要,为了让大家更快的掌握变频器维修知识,这里提供变频器维修的十种学习方法给大家。
    的头像 发表于 04-27 12:33 2074次阅读

    十种变频器维修方法,值得收藏!

    变频器维修学习方法有很多,但方向不对努力白费,所以抓住方向很重要,为了让大家更快的掌握变频器维修知识,这里提供变频器维修的十种学习方法给大家。
    的头像 发表于 05-04 18:04 7685次阅读