最近经常用pandas进行一些数据分析,感觉功能确实很强大,上手也还比较方便。但是无意见发现了一个关于DataFrame和Series赋值的性能问题。
从网上摘取一些数据一条一条的放入DataFrame中,当数据量较大时,感觉运行特别慢。原来还以为是DataFrame运算时比较耗时,但是用二维list数组读取数据,然后一次性放入DataFrame中却会快很多。写了一个简单的测试程序进行对比。
1 """
2 Created on Sun Jul 12 16:29:57 2015
3 @author: hbhuyt
4 """
5
6 import pandas as pd
7 import random
8 import timeit
9
10
11 def func1():
12 aa = []
13 for x in xrange(200):
14 aa.append([random.randint(0, 1000) for r in xrange(5)])
15 pdaa = pd.DataFrame(aa)
16
17 def func2():
18 pdbb = pd.DataFrame()
19 for y in xrange(200):
20 pdbb[y] = pd.Series([random.randint(0, 1000) for r in xrange(5)])
21
22 def func3():
23 aa = {}
24 for x in xrange(200):
25 aa[str(x)] = random.randint(0, 1000)
26 psaa = pd.Series(aa)
27
28 def func4():
29 psbb = pd.Series()
30 for y in xrange(200):
31 psbb[str(y)] = random.randint(0, 1000)
32
33
34 t1 = timeit.timeit(stmt =func1, number=1000)
35 t2 = timeit.timeit(stmt =func2, number=1000)
36 print t1, t2
37 t3 = timeit.timeit(stmt =func3, number=1000)
38 t4 = timeit.timeit(stmt =func4, number=1000)
39 print t3, t4
40
测试结果如下图:
可以看出DataFrame一行一行的填充数据是非常耗时的(与添加行的列数关系不大),最好是list或dict等标准容器填充数据后一次性导入到DataFrame中去。