详解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选择排序算法实例总结
Jul 01 Python
约瑟夫问题的Python和C++求解方法
Aug 20 Python
在python中使用正则表达式查找可嵌套字符串组
Oct 24 Python
Python数据可视化正态分布简单分析及实现代码
Dec 04 Python
Python网络编程之TCP套接字简单用法示例
Apr 09 Python
Python寻找两个有序数组的中位数实例详解
Dec 05 Python
通过celery异步处理一个查询任务的完整代码
Nov 19 Python
python画图时设置分辨率和画布大小的实现(plt.figure())
Jan 08 Python
python使用scapy模块实现ping扫描的过程详解
Jan 21 Python
python 实现定时任务的四种方式
Apr 01 Python
Jupyter notebook 更改文件打开的默认路径操作
May 21 Python
Python按顺序遍历并读取文件夹中文件
Apr 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
基于mysql的bbs设计(五)
2006/10/09 PHP
php引用计数器进行垃圾收集机制介绍
2012/09/19 PHP
php抽象类用法实例分析
2015/07/07 PHP
使用纯php代码实现页面伪静态的方法
2015/07/25 PHP
php中final关键字用法分析
2016/12/07 PHP
Js获取事件对象代码
2010/08/05 Javascript
javascript Array对象基础知识小结
2010/11/16 Javascript
JS正则表达式大全(整理详细且实用)
2013/11/14 Javascript
js判断浏览器类型为ie6时不执行
2014/06/15 Javascript
一个实用的图片切换支持点击切换和自动轮播
2014/09/09 Javascript
JavaScript中的全局对象介绍
2015/01/01 Javascript
jQuery调用ajax请求的常见方法汇总
2015/03/24 Javascript
JS实现左右无缝轮播图代码
2016/05/01 Javascript
微信小程序--onShareAppMessage分享参数用处(页面分享)
2017/04/18 Javascript
react高阶组件经典应用之权限控制详解
2017/09/07 Javascript
JS基于封装函数实现的表格分页完整示例
2018/06/26 Javascript
微信小程序实现按字母排列选择城市功能
2019/11/25 Javascript
小程序新版订阅消息模板消息
2019/12/31 Javascript
在Vue 中获取下拉框的文本及选项值操作
2020/08/13 Javascript
js+html+css实现手动轮播和自动轮播
2020/12/30 Javascript
[05:00]TI9战队采访 - Royal Never Give Up
2019/08/20 DOTA
Python多线程编程(六):可重入锁RLock
2015/04/05 Python
Python实现批量转换文件编码的方法
2015/07/28 Python
Python实现快速傅里叶变换的方法(FFT)
2018/07/21 Python
python使用原始套接字发送二层包(链路层帧)的方法
2019/07/22 Python
python机器学习库xgboost的使用
2020/01/20 Python
python 实现两个npy档案合并
2020/07/01 Python
flask开启多线程的具体方法
2020/08/02 Python
详解python的变量缓存机制
2021/01/24 Python
Python实现区域填充的示例代码
2021/02/03 Python
亚马逊加拿大网站:Amazon.ca
2020/01/06 全球购物
在校生汽车维修实习自我鉴定
2013/09/19 职场文书
群众路线个人对照检查材料
2014/09/23 职场文书
招商银行工作证明
2015/06/17 职场文书
2016年会领导致辞稿
2015/07/29 职场文书
redis的list数据类型相关命令介绍及使用
2022/01/18 Redis