最近經常用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中去。