最近經(jīng)常用pandas進(jìn)行一些數(shù)據(jù)分析,感覺(jué)功能確實(shí)很強(qiáng)大,上手也還比較方便。但是無(wú)意見(jiàn)發(fā)現(xiàn)了一個(gè)關(guān)于DataFrame和Series賦值的性能問(wèn)題。
從網(wǎng)上摘取一些數(shù)據(jù)一條一條的放入DataFrame中,當(dāng)數(shù)據(jù)量較大時(shí),感覺(jué)運(yùn)行特別慢。原來(lái)還以為是DataFrame運(yùn)算時(shí)比較耗時(shí),但是用二維list數(shù)組讀取數(shù)據(jù),然后一次性放入DataFrame中卻會(huì)快很多。寫了一個(gè)簡(jiǎn)單的測(cè)試程序進(jìn)行對(duì)比。
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
測(cè)試結(jié)果如下圖:

可以看出DataFrame一行一行的填充數(shù)據(jù)是非常耗時(shí)的(與添加行的列數(shù)關(guān)系不大),最好是list或dict等標(biāo)準(zhǔn)容器填充數(shù)據(jù)后一次性導(dǎo)入到DataFrame中去。