前言

在我们对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函数批量内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!