详解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实现的简单猜数字游戏
Apr 04 Python
Python内置函数 next的具体使用方法
Nov 24 Python
解决python3中解压zip文件是文件名乱码的问题
Mar 22 Python
对Python 2.7 pandas 中的read_excel详解
May 04 Python
基于Python pip用国内镜像下载的方法
Jun 12 Python
Python subprocess模块功能与常见用法实例详解
Jun 28 Python
python实现把两个二维array叠加成三维array示例
Nov 29 Python
使用Pytorch来拟合函数方式
Jan 14 Python
python3 sleep 延时秒 毫秒实例
May 04 Python
Python二元算术运算常用方法解析
Sep 15 Python
python中字符串的编码与解码详析
Dec 03 Python
Flask response响应的具体使用
Jul 15 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 number_format() 函数通过千位分组来格式化数字的实现代码
2013/08/06 PHP
浅谈php提交form表单
2015/07/01 PHP
YII Framework框架教程之使用YIIC快速创建YII应用详解
2016/03/15 PHP
PHP微信开发之根据用户回复关键词\位置返回附近信息
2016/06/24 PHP
中高级PHP程序员应该掌握哪些技术?
2016/09/23 PHP
php封装的smartyBC类完整实例
2016/10/19 PHP
Javascript中的变量使用说明
2010/05/18 Javascript
jquery中实现简单的tabs插件功能的代码
2011/03/02 Javascript
推荐10个超棒的jQuery工具提示插件
2011/10/11 Javascript
能说明你的Javascript技术很烂的五个原因分析
2011/10/28 Javascript
jQuery事件绑定与解除绑定实现方法
2015/04/15 Javascript
基于JS实现省市联动效果代码分享
2016/06/06 Javascript
AngularJS 工作原理详解
2016/08/18 Javascript
AngularJS入门教程之XHR和依赖注入详解
2016/08/18 Javascript
JS用斜率判断鼠标进入DIV四个方向的方法
2016/11/07 Javascript
移动开发之自适应手机屏幕宽度
2016/11/23 Javascript
angular 基于ng-messages的表单验证实例
2017/05/04 Javascript
少女风vue组件库的制作全过程
2019/05/15 Javascript
[02:07]TI9显影之尘系列 - Vici Gaming
2019/08/20 DOTA
python中logging库的使用总结
2017/10/18 Python
Windows下Anaconda的安装和简单使用方法
2018/01/04 Python
pandas.DataFrame 根据条件新建列并赋值的方法
2018/04/08 Python
python获取程序执行文件路径的方法(推荐)
2018/04/26 Python
Django项目主urls导入应用中views的红线问题解决
2019/08/10 Python
Python socket模块ftp传输文件过程解析
2019/11/05 Python
pytorch中的卷积和池化计算方式详解
2020/01/03 Python
化工专业应届生求职信
2013/11/08 职场文书
合伙协议书范本
2014/04/21 职场文书
2015年乡镇信访工作总结
2015/04/07 职场文书
民事申诉状范本
2015/05/20 职场文书
复兴之路观后感3000字
2015/06/02 职场文书
法律服务所工作总结
2015/08/10 职场文书
2019毕业典礼主持词!
2019/07/05 职场文书
Python数据分析入门之教你怎么搭建环境
2021/05/13 Python
Mysql InnoDB 的内存逻辑架构
2022/05/06 MySQL
Python使用pandas导入csv文件内容的示例代码
2022/12/24 Python