Pandas Series方法 性能测试

对于pandas的Series数据,进行整体的数据变换是常见的事,包括类型转换,字符串切割,数据计算等等,如何高性能地完成这些数据变换,对于大规模的数据处理至关重要。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import numpy as np
import pandas as pd
import timeit

a = pd.Series(range(1000))

# %timeit a.apply(lambda x:x+2) 385us

def func1(x):
return x + 2

# %timeit func1(a) 88us

# %timeit a.astype('str') 524us

def func2(x):
return str(x)

# %timeit func2(a) 383us

b = pd.Series(['abcdefg' for i in range(1000)])

# %timeit b.str[3:5] 287us

def func3(x):
return x[3:5]

# func3(b) mistake

# 3 abcdefg
# 4 abcdefg
# dtype: object

series作为函数参数传入

series作为函数参数传入,由于未指定函数参数类型,因而该函数可以传入标量,也可以传入向量,传入向量则为向量运算。但需要注意的是,对于[]切片运算,如果传入的是向量,并不会对内部标量进行切割,而是对向量本身进行切割,这也导致了执行func3(b)的时候,没能达成我们想要的目标。由于是向量运算,这种方式执行的速度比较快。

series作为主体,调用函数

series作为主题,通过.func的形式调用函数,这种方式的速度较慢,耗时较长。尤其是通常使用的.astype.apply,会降低运行效率。