Pandas批量数据处理指南:map、apply与applymap的高效用法
本文深入解析Pandas中map、apply和applymap三个核心函数的用法与区别。通过实际案例演示如何将Series或DataFrame中的数据批量映射到函数、字典或Series中,并对比传统遍历与list暂存方法的性能。实验表明,使用内置映射函数处理数据可提升500倍以上的速度,是高效数据清洗与转换的关键工具。
Pandas批量数据处理指南:map、apply与applymap的高效用法
前言
在处理DataFrame对象时,初学者往往倾向于直接遍历数据并将结果重新填入,这种方式不仅代码繁琐,面对海量数据时还会导致严重的性能瓶颈。Pandas提供了内置的批量处理工具集,包括map、apply和applymap,能够高效地对数据进行函数映射与转换。
提示:为方便快捷地解决问题,本文仅介绍函数的主要用法,并非全面介绍
pandas.Series.map()基础与用法
一、pandas.Series.map()是什么?
Series.map()的主要功能是将Series中的每一个值逐一映射,通过传入的函数、字典或Series计算出新的值,并返回一个新的Series对象。
Series.map(arg, na_action=None)
参数说明如下:
- arg: 可以是函数、字典类数据或Series,用于定义映射关系。
- na_action{None, ‘ignore'}: 默认为None;用于处理NaN变量。如果设为None,则不处理NaN对象;如果设为‘ignore',则将NaN对象视为普通对象带入规则进行处理。
返回Series
map()函数的性能优势对比
二、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()函数
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()对DataFrame的处理
三、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函数批量内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









