详解pandas映射与数据转换


Posted in Python onJanuary 22, 2021

在 pandas 中提供了利用映射关系来实现某些操作的函数,具体如下:

  • replace() 函数:替换元素;
  • map() 函数:新建一列;
  • rename() 函数:替换索引。

一、replace() 用映射替换元素

在数据处理时,经常会遇到需要将数据结构中原来的元素根据实际需求替换成新元素的情况。要想用新元素替换原来元素,就需要定义一组映射关系。在映射关系中,将旧元素作为键,新元素作为值。

例如,创建字典 fruits 用于指明水果标识和水果名称的映射关系。

fruits={101:'orange',102:'apple',103:'banana'}

如要将用于存储水果标识、水果数量和单价的 DataFrame 对象中的水果标识替换成水果名称,就需要运用 replace() 函数,通过 fruits 映射关系来实现元素的替换。

replace() 函数的基本语法格式如下:

obj.replace(to_replace=None,value=None,inplace=False,limit=None,regex=
False,method='pad')

函数中的参数说明如下:

  • obj:DataFrame 或 Series 对象;
  • to_replace:接收 str、regex、list、dict、Series、int、float 或者 None,表示将被替换的值;
  • value:接收标量、字典、列表、str、正则表达式,默认为 None;用于替换与 to_replace 匹配的任何值的值;对于 DataFrame,可以使用值的 dict 来指定每列使用哪个值(不在 dict 中的列将不会被填充);还允许使用正则表达式、字符串和列表或这些对象的 dict;
  • inplace:接收布尔值,默认为 False,如果是 True,将修改原来的数据;
  • limit:接收 int,默认为 None,用于限制填充次数;
  • regex:接收 bool 或与 to_replace 相同的类型,默认为 False,表示是否将 to_replace 或 value 解释为正则表达式,如果是 True,那么 to_replace 必须是一个字符串,当是正则表达式或正则表达式的列表、字典或数组时,to_replace 必须为 None;
  • method:取值为 {'pad','ffill','bfill',无},表示替换时使用的方法,与缺失值填充方法类似,当 to_replace 是标量、列表或元组时,值为 None。

【例 1】利用 replace() 函数和映射关系实现将水果数据框中水果标识替换成水果名称。
示例代码 test1.py 如下:

import numpy as np
import pandas as pd
#创建水果标识与水果名称的映射关系
fruits = {101:'orange',102:'apple',103:'banana'}
#创建水果数据框DataFrame
data = pd.DataFrame({'fru_No':[101,102,103]          ,'fru_Num':[1000,2000,3000]
          ,'price':[3.56,4.2,2.5]})
#用映射替换fru_No列的元素
newDf = data.replace(fruits)
print(newDf)
#输出如下
 fru_No fru_Num price
0 orange  1000  3.56
1 apple  2000  4.20
2 banana  3000  2.50

replace() 函数应用的示例代码 example1.py 如下:

import numpy as np
import pandas as pd
from pandas import Series,DataFrame
s = Series([-1000,-999,2,3,4,5,-2000])
#单数值替换
print(s.replace(-2000,np.nan))
0 -1000.0
1 -999.0
2 2.0
3 3.0
4 4.0
5 5.0
6 NaN

#将多个数值替换
print(s.replace([-1000,-999],0))
0 0
1 0
2 2
3 3
4 4
5 5
6 -2000

#不同的值进行不同的替换
print(s.replace([-1000,-999],[np.nan,0]))
0 NaN
1 0.0
2 2.0
3 3.0
4 4.0
5 5.0
6 -2000.0

#用字典方式进行不同的替换
print(s.replace({-1000:np.nan,-999:0,-2000:np.nan}))
0 NaN
1 0.0
2 2.0
3 3.0
4 4.0
5 5.0
6 NaN

二、用映射添加元素

   在【例 1】中介绍了利用函数和映射来实现将水果标识替换成水果名称的方法。但是有时需要保留水果标识,将水果名称添加到数据集中。

   那么,这时可利用 map() 函数,通过构建 fruits 映射关系来实现元素的添加。

map() 函数是作用于 Series 或 DataFrame 对象的一列,它接收一个函数或表示映射关系的字典作为参数,它的基本语法格式如下:

Series.map(arg,na_action=None)

函数中的参数说明如下:

  • arg:接收 function、dict 或 Series,表示映射通信;
  • na_action:取值为{无,'忽略'},默认值为 None,如果为'忽略',则传播 NA 值,而不将它们传递给映射对应关系。

【例 2】利用 map() 函数和映射关系实现将水果名称添加到水果数据框中。
示例代码 test2.py 如下:

import pandas as pd
#创建水果标识与水果名称的映射关系
fruits = {101:'orange',102:'apple',103:'banana'}
#创建水果数据框DataFrame
data = pd.DataFrame({'fru_No':[101,102,103],'fru_Num':[1000,2000,3000],'price':
          [3.56,4.2,2.5]})
#用映射为data添加fru_name列元素
data['fru_name'] = data['fru_No'].map(fruits)
print(data)
 fru_No fru_Num price fru_name
0 101  1000  3.56 orange
1 102  2000  4.20 apple
2 103  3000  2.50 banana

三、重命名行/列索引

在数据处理中,有时需要使用映射关系转换轴标签。pandas 的 rename() 函数是以表示映射关系的字典对象作为参数,替换轴的索引标签。
rename() 函数的基本语法格式如下:

DataFrame.rename(mapper=None,index=None,columns=None,axis=None,copy=True,
inplace=False,level=None)
或
Series.rename(index=None,**kwargs)

函数中的参数说明如下:

  • mapper、index、columns:接收 dict或 function,表示将 dict 或函数转换为应用于该轴的值,使用 mapper 参数要指定映射器;使用 columns 参数可重命名各列;
  • axis:接收 int 或 str,可选,表示映射器定位的轴,可以是轴名称(“index”,“columns”)或数字(0,1),默认为“index”;
  • copy:接收 boolean,默认为 True,表示是否复制数据;
  • inplace:接收 boolean,默认为 False,如果为 True,将会修改原来的数据;
  • level:接收 int 或 level name,默认为 None,如果是 MultiIndex,只重命名指定级别中的标签。

rename() 函数返回值是 DataFrame 或 Series。
【例 3】利用 rename() 函数和映射关系重命名水果数据框的行索引和列索引。
示例代码 test3.py 如下:

import pandas as pd
#创建行索引的映射关系
reindex = {0:'row1',1:'row2',2:'row3'}
#创建水果数据框DataFrame
data = pd.DataFrame({'fru_No':[101,102,103],'fru_Num':[1000,2000,3000],'price':
          [3.56,4.2,2.5]})
 fru_No fru_Num price
0  101 1000  3.56
1  102 2000  4.20
2  103 3000  2.50

#用映射重命名水果数据框的行索引,产生新DataFrame,但原数据不改变
newDf = data.rename(reindex)
print(newDf)
  fru_No fru_Num price
row1 101  1000  3.56
row2 102  2000  4.20
row3 103  3000  2.50

#用映射重命名水果数据框的行索引,产生新DataFrame,但原数据改变
newDf = data.rename(reindex,inplace=True)
print(newDf) #newDf是None,data原数据改变
#创建列索引的映射关系
recolumns = {'fru_No':'col1','fru_Num':'col2','price':'col3'}
#用映射重命名水果数据框中的行索引和列索引
newDf = data.rename(index=reindex,columns=recolumns)
print(newDf)
  col1 col2 col3
row1 101 1000 3.56
row2 102 2000 4.20
row3 103 3000 2.50

#用映射重命名水果数据框的单个行索引和单个列索引
newDf = data.rename(index={'row2':'s1'},columns={'fru_No':'111'})
print(newDf)
   111 fru_Num price
row1 101 1000  3.56
s1  102 2000  4.20
row3 103 3000  2.50

注意:rename() 函数返回一个经过改动的新 DataFrame 对象,但原 DataFrame 对象仍保持不变,如果要改变调用函数的对象本身,可使用 inplace 选项,并将其值设置为 True。

以上就是详解pandas映射与数据转换的详细内容,更多关于pandas映射与数据转换的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python的Bottle框架的一些使用技巧介绍
Apr 08 Python
详解python实现读取邮件数据并下载附件的实例
Aug 03 Python
Python正则表达式指南 推荐
Oct 09 Python
Pandas分组与排序的实现
Jul 23 Python
Python合并2个字典成1个新字典的方法(9种)
Dec 19 Python
浅谈python多线程和多线程变量共享问题介绍
Apr 17 Python
解决在keras中使用model.save()函数保存模型失败的问题
May 21 Python
Python如何把十进制数转换成ip地址
May 25 Python
Python 实现简单的客户端认证
Jul 29 Python
如何通过python计算圆周率PI
Nov 11 Python
python实现socket简单通信的示例代码
Apr 13 Python
Python快速实现一键抠图功能的全过程
Jun 29 Python
python实现简单的井字棋游戏(gui界面)
Jan 22 #Python
Django url 路由匹配过程详解
Jan 22 #Python
浅析pandas随机排列与随机抽样
Jan 22 #Python
python 合并多个excel中同名的sheet
Jan 22 #Python
Python读取pdf表格写入excel的方法
Jan 22 #Python
python 基于UDP协议套接字通信的实现
Jan 22 #Python
详解matplotlib中pyplot和面向对象两种绘图模式之间的关系
Jan 22 #Python
You might like
php 去除html标记--strip_tags与htmlspecialchars的区别详解
2013/06/26 PHP
windows7下安装php的imagick和imagemagick扩展教程
2014/07/04 PHP
使用PHP+AJAX让WordPress动态加载文章的教程
2015/12/11 PHP
PHP文件与目录操作示例
2016/12/24 PHP
JQuery验证jsp页面属性是否为空(实例代码)
2013/11/08 Javascript
解决jquery1.9不支持browser对象的问题
2013/11/13 Javascript
javascript创建数组之联合数组的使用方法示例
2013/12/26 Javascript
使用jquery.upload.js实现异步上传示例代码
2014/07/29 Javascript
javascript实现动态加载CSS
2015/01/26 Javascript
javascript包装对象实例分析
2015/03/27 Javascript
JS模式之简单的订阅者和发布者模式完整实例
2015/06/30 Javascript
js获取当前周、上一周、下一周日期
2017/03/19 Javascript
vux uploader 图片上传组件的安装使用方法
2018/05/15 Javascript
js中的reduce()函数讲解
2019/01/18 Javascript
ES6中Promise的使用方法实例总结
2020/02/18 Javascript
Angular利用HTTP POST下载流文件的步骤记录
2020/07/26 Javascript
vue 项目@change多个参数传值多个事件的操作
2021/01/29 Vue.js
[02:39]我与DAC之Newbee.Moogy:从论坛到TI
2018/03/26 DOTA
python计算一个序列的平均值的方法
2015/07/11 Python
Python读取图片属性信息的实现方法
2016/09/11 Python
python爬虫爬取淘宝商品信息
2018/02/23 Python
python 读入多行数据的实例
2018/04/19 Python
在Python中等距取出一个数组其中n个数的实现方式
2019/11/27 Python
使用python远程操作linux过程解析
2019/12/04 Python
python 视频逐帧保存为图片的完整实例
2019/12/10 Python
python base64库给用户名或密码加密的流程
2020/01/02 Python
python怎么自定义捕获错误
2020/06/29 Python
一款纯css3实现的响应式导航
2014/10/31 HTML / CSS
一款基于css3和jquery实现的动画显示弹出层按钮教程
2015/01/04 HTML / CSS
goodhealth官方海外旗舰店:新西兰国民营养师
2017/12/15 全球购物
JOSEPH官网:英国奢侈时尚品牌
2018/01/31 全球购物
幼儿园招生广告
2014/03/19 职场文书
群众路线教育实践活动民主生活会个人检查对照思想汇报
2014/10/04 职场文书
签订劳动合同通知书
2015/04/16 职场文书
硕士毕业答辩开场白
2015/05/27 职场文书
用javascript制作qq注册动态页面
2021/04/14 Javascript