Python中的apply和lambda函数应用
在pandas中,apply和lambda两个函数的使用方法简介和测试用例。
1、apply
Pandas 的 apply() 方法是用来调用一个函数(Python method),让此函数对数据对象进行批量处理。Pandas 的很多对象都可以使用 apply() 来调用函数,如 Dataframe、Series、分组对象、各种时间序列等。
apply() 使用时,通常放入一个 lambda 函数表达式、或一个函数作为操作运算,官方上给出DataFrame的 apply() 用法:
DataFrame.apply(self, func, axis=0, raw=False, result_type=None,
args=(), **kwargs)
(1)测试用例:
测试一下效率:
方法一:用lambda 计算三列的和
方法二:直接用dataframe计算三列的和
用10000行记录测试。
import random
import string
import pandas as pd
from datetime import datetime
def my_test(b,c,d):
return b+c+d
lst_a = []
for i in range(10000):
str = random.sample(string.ascii_letters, 16)
lst_a.append(''.join(str))
df = pd.DataFrame({'a': lst_a,
'b': np.random.randn(10000),
'c': np.random.randn(10000),
'd': np.random.randn(10000)})
df.set_index('a',inplace = True)
print(df)
# 方法1
time1 = datetime.now()
#使用lambda计算
df1 = pd.DataFrame({'mytest':df.apply(lambda row: my_test(row['b'], row['c'], row['d']), axis=1)})
total_seconds = (datetime.now() - time1).total_seconds()
print('spend time:',total_seconds)
#print(df1)
# 方法2
time1 = datetime.now()
df2 = pd.DataFrame({'myvalue': df['b'] + df['c'] + df['d']})
total_seconds = (datetime.now() - time1).total_seconds()
print('spend time:',total_seconds)
#print(df2)
(2)测试结果:
b c d
a
cglSuErAjCRzTJfU 0.833020 1.265337 0.089077
TzEpfyJRmglxvSkP 1.117320 -1.285941 -1.057394
iHCuYWqjabFPQMnZ -0.732941 -0.406586 0.506080
VhdLYmIwAHzjQPkx 0.053923 0.036442 0.099741
MjbKEeupkXQciYTx -0.675878 1.197151 0.001515
... ... ... ...
ZVwSaeFIpJUuKbvW -0.436833 -1.413206 0.173300
UDXzALqQtEYvdmJp -0.053518 0.222667 -1.150793
YrdmPJeuLESDAHFa -1.025011 -0.448613 0.549938
pkEtnAyZgPwLihKG -1.023037 0.388634 0.157503
rwVlsUnavIQPkjBx -0.014395 0.581768 -0.906610
[10000 rows x 3 columns]
spend time: 0.097323
spend time: 0.000675
方法二的效率是方法一的144倍,还是在dataframe中计算效率高。
2、lambda
匿名函数lambda:匿名函数,通俗地说就是没有名字的函数,lambda函数没有名字,是一种简单的、在同一行中定义函数的方法。
lambda函数一般功能简单:单行 表达式决定了lambda函数不可能完成复杂的逻辑,只能完成非常简单的功能。由于其实现的功能一目了然,甚至不需要专门的名字来说明。
lambda 函数可以接收任意多个参数 (包括可选参数) 并且返回单个表达式的值。
lambda表达式只允许包含一个表达式,不能包含复杂语句,该表达式的运算结果就是函数的返回值。
(1)测试用例:
import random
import string
import pandas as pd
#平方,一个参数
square = lambda x: x**2
#乘积,三个参数
product = lambda x,y,z: x*y*z
#参数是list ,返回有序的list
sort_length = lambda lst: sorted(lst_a)
#参数是字符串,返回大写字符串
uppercase = lambda s: s.upper()
# 参数是数字,返回是布尔值
is_even = lambda x: x % 2 == 0
lst_a = np.random.rand(8)
str = random.sample(string.ascii_letters, 16)
str_b=''.join(str)
print(lst_a)
print(sort_length(lst_a))
print(square(8))
print(uppercase(str_b))
print(is_even(3))
(2)测试结果:
[0.1401774 0.07369117 0.07266297 0.59028196 0.46876008 0.22168191
0.25371426 0.91494125]
[0.0726629739219603, 0.07369116771417583, 0.14017740491981678, 0.22168190639605723, 0.2537142626280722, 0.46876007719865276, 0.5902819579210462, 0.914941251521296]
64
SAMWFPUHYJNQNULP
False