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守护进程(daemon)代码实例
Mar 06 Python
Python 私有函数的实例详解
Sep 11 Python
python获取文件路径、文件名、后缀名的实例
Apr 23 Python
Python DataFrame 设置输出不显示index(索引)值的方法
Jun 07 Python
基于python中theano库的线性回归
Aug 31 Python
Python自定义一个异常类的方法
Jun 27 Python
python使用 __init__初始化操作简单示例
Sep 26 Python
Django xadmin开启搜索功能的实现
Nov 15 Python
python程序文件扩展名知识点详解
Feb 27 Python
python pyecharts 实现一个文件绘制多张图
May 13 Python
如何清空python的变量
Jul 05 Python
详解Django中的FBV和CBV对比分析
Mar 01 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
优化NFR之一 --MSSQL Hello Buffer Overflow
2006/10/09 PHP
用PHP开发GUI
2006/10/09 PHP
php+jquery编码方面的一些心得(utf-8 gb2312)
2010/10/12 PHP
PHP多线程类及用法实例
2014/12/03 PHP
php中namespace use用法实例分析
2016/01/22 PHP
highchart数据源纵轴json内的值必须是int(详解)
2017/02/20 PHP
PHP 中TP5 Request 请求对象的实例详解
2017/07/31 PHP
Laravel如何使用数据库事务及捕获事务失败后的异常详解
2017/10/23 PHP
Javascript !!的作用
2008/12/04 Javascript
javascript 弹出窗口中是否显示地址栏的实现代码
2011/04/14 Javascript
JavaScript DOM 编程艺术(第2版)读书笔记(JavaScript的最佳实践)
2013/10/01 Javascript
jquery和雅虎的yql服务实现天气预报服务示例
2014/02/08 Javascript
js 加密压缩出现bug解决方案
2014/11/25 Javascript
如何判断Javascript对象是否存在的简单实例
2016/05/18 Javascript
js实现复选框的全选和取消全选效果
2017/01/03 Javascript
vue2.0开发入门笔记之.vue文件的生成和使用
2017/09/19 Javascript
初识 Vue.js 中的 *.Vue文件
2017/11/22 Javascript
Vue中的slot使用插槽分发内容的方法
2018/03/01 Javascript
React Component存在的几种形式详解
2018/11/06 Javascript
vue 实现小程序或商品秒杀倒计时
2019/04/14 Javascript
详解微信小程序实现跑马灯效果(附完整代码)
2019/04/29 Javascript
angular inputNumber指令输入框只能输入数字的实现
2019/12/03 Javascript
Vue使用预渲染代替SSR的方法
2020/07/02 Javascript
Python创建xml的方法
2015/03/10 Python
浅谈tensorflow1.0 池化层(pooling)和全连接层(dense)
2018/04/27 Python
python 实现selenium断言和验证的方法
2019/02/13 Python
Python基于class()实现面向对象原理详解
2020/03/26 Python
Python打印特殊符号及对应编码解析
2020/05/07 Python
锐步英国官网:Reebok英国
2019/11/29 全球购物
护士进修自我鉴定
2014/02/07 职场文书
工伤赔偿协议书范本
2014/04/15 职场文书
岗位职责说明书
2014/05/07 职场文书
学习保证书怎么写
2015/02/26 职场文书
新闻稿件写作范文
2015/07/18 职场文书
Java实战之用Swing实现通讯录管理系统
2021/06/13 Java/Android
Python实现排序方法常见的四种
2021/07/15 Python