huyutian

他强由他强,清风拂山岗;他横由他横,明月照大江。他自狠来他自恶,我自一口真气足

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  20 随笔 :: 47 文章 :: 22 评论 :: 0 Trackbacks
最近经常用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中去。
posted on 2015-08-11 09:15 胡雨田 阅读(6839) 评论(0)  编辑 收藏 引用 所属分类: 编程技巧

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理