pandas使用函数批量处理数据(map、apply、applymap)


Posted in Python onNovember 27, 2020

前言

在我们对DataFrame对象进行处理时候,下意识的会想到对DataFrame进行遍历,然后将处理后的值再填入DataFrame中,这样做比较繁琐,且处理大量数据时耗时较长。Pandas内置了一个可以对DataFrame批量进行函数处理的工具:map、apply和applymap。

提示:为方便快捷地解决问题,本文仅介绍函数的主要用法,并非全面介绍

一、pandas.Series.map()是什么?

把Series中的值进行逐一映射,带入进函数、字典或Series中得出的另一个值。

Series.map(arg, na_action=None)

参数:

  • arg:函数、字典类数据、Series;映射对应关系
  • na_action{None, ‘ignore'}:默认为None;处理NaN变量,如果为None则不处理NaN对象,如果为‘ignore'则将NaN对象当做普通对象带入规则。

返回Series

二、pandas.Series.map()用法和优点

本节主要讲述map()函数的主要用法和相比于方法的优点

1、map()用法

创建案例DataFrame

import pandas as pd
import numpy as np
import time

data = pd.DataFrame({'name':['Verne Raymond','Chapman Becher','Patrick George','Saxon MacArthur',
               'Joshua Marjory','Luther Pigou','Fanny Agnes','Karen Bush','Elaine Whitman'],
             'gender':[0,1,0,0,1,1,1,0,1],'first_name':np.nan,'last_name':np.nan})

print(data)

              name  gender  first_name  last_name
0    Verne Raymond       0         NaN        NaN
1   Chapman Becher       1         NaN        NaN
2   Patrick George       0         NaN        NaN
3  Saxon MacArthur       0         NaN        NaN
4   Joshua Marjory       1         NaN        NaN
5     Luther Pigou       1         NaN        NaN
6      Fanny Agnes       1         NaN        NaN
7       Karen Bush       0         NaN        NaN
8   Elaine Whitman       1         NaN        NaN

现在需要将name列的姓和名拆分开来分别放入first_name 和last_name里面,使用map()函数实现,并计算所用时间

def first_name_map(x):
  return x.split(' ')[0]
def last_name_map(x):
  return x.split(' ')[1]

data['first_name'] = data['name'].map(first_name_map)
data['last_name'] = data['name'].map(last_name_map)

print('use time:'+str(end-start))
print(data)

use time:0.0009970664978027344
              name  gender first_name  last_name
0    Verne Raymond       0      Verne    Raymond
1   Chapman Becher       1    Chapman     Becher
2   Patrick George       0    Patrick     George
3  Saxon MacArthur       0      Saxon  MacArthur
4   Joshua Marjory       1     Joshua    Marjory
5     Luther Pigou       1     Luther      Pigou
6      Fanny Agnes       1      Fanny      Agnes
7       Karen Bush       0      Karen       Bush
8   Elaine Whitman       1     Elaine    Whitman

如果要将性别代号的0、1替换为中文Male和Female,可以使用字典映射功能,如下

data['gender'] = data['gender'].map({0:'Female',1:'Male'})

print(data)

              name  gender first_name  last_name
0    Verne Raymond  Female      Verne    Raymond
1   Chapman Becher    Male    Chapman     Becher
2   Patrick George  Female    Patrick     George
3  Saxon MacArthur  Female      Saxon  MacArthur
4   Joshua Marjory    Male     Joshua    Marjory
5     Luther Pigou    Male     Luther      Pigou
6      Fanny Agnes    Male      Fanny      Agnes
7       Karen Bush  Female      Karen       Bush
8   Elaine Whitman    Male     Elaine    Whitman

2、map()相比其他方式的优点

较普通的方法主要是方便和速度快,下面例子进行对比,上面已经计算过使用map()方法处理的速度为:0.0009970664978027344

传统遍历

start = time.time()
for index,rows in data.iterrows():
  data['first_name'][index] = rows['name'].split(' ')[0]
  data['last_name'][index] = rows['name'].split(' ')[1]
end = time.time()
print('use time:'+str(end-start))

use time:0.5146446228027344

可以看到使用map()方法比使用直接遍历的方式快了500多倍

list暂存的方法

start = time.time()
first_name = []
last_name = []
for index,rows in data.iterrows():
  first_name.append(rows['name'].split(' ')[0])
  last_name.append(rows['name'].split(' ')[1])
data['first_name'] = first_name
data['last_name'] = last_name
end = time.time()
print('use time:'+str(end-start))

use time:0.001994609832763672

可以看出来使用list暂存的方法比遍历方法快了250多倍,但是比map方法还是慢了一半

二、apply()函数

apply()的使用方法与map()的使用方法类似,只是apply()除了传入Series参数外还可以多传入额外的参数。

Series.apply(func,convert_dtype = True,args = (), **kwds)

参数:
func:函数名称

convert_dtype:bool类值, 默认为True;尝试自己寻找最适合的数据类型。如果为False则dtype=object。

args:元组;在Series之后传递位置参数信息

**kwds:给函数传递其他参数(以字典的形式)

返回Series或DataFrame

下面是案例(参考官方文档案例)

s = pd.Series([20, 21, 12],index=['London', 'New York', 'Helsinki'])
print(s)

London      20
New York    21
Helsinki    12
dtype: int64

处理数据

def subtract_custom_value(x, custom_value):
  return x - custom_value
s.apply(subtract_custom_value, args=(5,))

London      15
New York    16
Helsinki     7
dtype: int64

使用**kwds参数

def subtract_custom_value(x, **kwds):
  for key in kwds:
    x -= kwds[key]
  return x
s.apply(subtract_custom_value, num = 5)

London      15
New York    16
Helsinki     7
dtype: int64

三、applymap()函数用法

applymap()函数处理的对象是DataFrame,并非Series,它没有前面两个函数用得多,但在某些情况也很有用。

DataFrame.applymap(func)

参数:
func:函数;要调用的Python函数,输入输出都为单个值

返回DataFrame

下面是简单的案例:

import pandas as pd
import numpy as np
data = pd.DataFrame(
  {
    "A":np.random.randn(3),
    "B":np.random.randn(3),
    "C":np.random.randn(3),
  }
)
print(data )

          A         B         C
0  2.128483 -1.701311 -1.362955
1 -1.149937  1.108856 -0.259637
2 -0.076621 -0.379672 -2.636464

计算所有值的平方:

data.applymap(lambda x: x**2)

          A         B         C
0  4.530439  2.894459  1.857645
1  1.322356  1.229561  0.067411
2  0.005871  0.144151  6.950940

总结

本文展示了Pandas将数据映射到函数里批量快速处理的方法,主要使用的了Pandas自带的map、apply和applymap工具,实验结果是比普通循环快500倍,后续还将介绍更多数据处理实用的技巧。

到此这篇关于pandas使用函数批量处理数据(map、apply、applymap)的文章就介绍到这了,更多相关pandas函数批量内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python极简代码实现杨辉三角示例代码
Nov 15 Python
Python通过matplotlib绘制动画简单实例
Dec 13 Python
python opencv检测目标颜色的实例讲解
Apr 02 Python
pandas的object对象转时间对象的方法
Apr 11 Python
Python使用pyodbc访问数据库操作方法详解
Jul 05 Python
对numpy中的where方法嵌套使用详解
Oct 31 Python
Python 按字典dict的键排序,并取出相应的键值放于list中的实例
Feb 12 Python
python 检查数据中是否有缺失值,删除缺失值的方式
Dec 02 Python
解决Keras 自定义层时遇到版本的问题
Jun 16 Python
记一次Django响应超慢的解决过程
Sep 17 Python
Python基础之tkinter图形化界面学习
Apr 29 Python
浅谈Python从全局与局部变量到装饰器的相关知识
Jun 21 Python
python3.7中安装paddleocr及paddlepaddle包的多种方法
Nov 27 #Python
Python基于template实现字符串替换
Nov 27 #Python
使用Python画了一棵圣诞树的实例代码
Nov 27 #Python
python 用opencv实现霍夫线变换
Nov 27 #Python
详解python定时简单爬取网页新闻存入数据库并发送邮件
Nov 27 #Python
五种Python转义表示法
Nov 27 #Python
Django如何继承AbstractUser扩展字段
Nov 27 #Python
You might like
php一次性删除前台checkbox多选内容的方法
2013/09/22 PHP
微信自定义菜单的处理开发示例
2015/04/16 PHP
php中关于长度计算容易混淆的问题分析
2016/05/27 PHP
TP5(thinkPHP5)框架基于ajax与后台数据交互操作简单示例
2018/09/03 PHP
在PHP中实现使用Guzzle执行POST和GET请求
2019/10/15 PHP
laravel 执行迁移回滚示例
2019/10/23 PHP
使用EXT实现无刷新动态调用股票信息
2008/11/01 Javascript
JavaScript中Object和Function的关系小结
2009/09/26 Javascript
js 实现图片预加载(js操作 Image对象属性complete ,事件onload 异步加载图片)
2011/03/25 Javascript
JSON辅助格式化处理方法
2013/03/26 Javascript
javascript中match函数的用法小结
2014/02/08 Javascript
jquery.form.js实现将form提交转为ajax方式提交的方法
2015/04/07 Javascript
JavaScript 模块化编程(笔记)
2015/04/08 Javascript
JS获取数组最大值、最小值及长度的方法
2015/11/24 Javascript
jQuery页面元素动态添加后绑定事件丢失方法,非 live
2016/06/16 Javascript
Javascript将JSON日期格式化
2016/08/23 Javascript
利用VUE框架,实现列表分页功能示例代码
2017/01/12 Javascript
浅谈jquery拼接字符串效率比较高的方法
2017/02/22 Javascript
JS Input里添加小图标的两种方法
2017/11/11 Javascript
JavaScript通过mouseover()实现图片变大效果的示例
2017/12/20 Javascript
Nodejs实现用户注册功能
2019/04/14 NodeJs
vue中使用props传值的方法
2019/05/08 Javascript
vue本地打开build后生成的dist文件夹index.html问题
2019/09/04 Javascript
JS window对象简单操作完整示例
2020/01/14 Javascript
基于better-scroll 实现歌词联动功能的代码
2020/05/07 Javascript
vue实现简易图片左右旋转,上一张,下一张组件案例
2020/07/31 Javascript
JS画布动态实现黑客帝国背景效果
2020/11/08 Javascript
使用pyecharts在jupyter notebook上绘图
2020/04/23 Python
Python如何基于smtplib发不同格式的邮件
2019/12/30 Python
scrapy redis配置文件setting参数详解
2020/11/18 Python
处理HTML5新标签的浏览器兼容版问题
2017/03/13 HTML / CSS
阿根廷旅游网站:almundo阿根廷
2018/02/12 全球购物
2014年医院后勤工作总结
2014/12/06 职场文书
2015年度党员自我评价范文
2015/03/03 职场文书
开网店计划分析
2019/07/30 职场文书
如何有效防止sql注入的方法
2021/05/25 SQL Server