前言
在我们对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倍,后续还将介绍更多数据处理实用的技巧。
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新动态
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]