【发布时间】:2015-05-25 03:55:56
【问题描述】:
我正在编写一些对性能敏感的代码,我必须在其中快速向 Pandas 数据框添加大量列。
通过从 dict 构造第二个数据帧并将它们连接起来,我已经设法比单纯地重复 df[foo] = bar 提高了 3 倍:
def mkdf1(n):
df = pd.DataFrame(index=range(10,20), columns=list('qwertyuiop'))
for i in xrange(n):
df['col%d' % i] = range(i, 10+i)
return df
def mkdf2(n):
df = pd.DataFrame(index=range(10,20), columns=list('qwertyuiop'))
newcols = {}
for i in xrange(n):
newcols['col%d' % i] = range(i, 10+i)
return pd.concat([df, pd.DataFrame(newcols, index=df.index)], axis=1)
时间安排显示出实质性改进:
%timeit -r 1 mkdf1(100)
100 loops, best of 1: 16.6 ms per loop
%timeit -r 1 mkdf2(100)
100 loops, best of 1: 5.5 ms per loop
我可以在这里做任何其他优化吗?
编辑:另外,concat 调用在我的真实代码中花费的时间比我的玩具示例要长得多;特别是 get_result 函数需要更长的时间,尽管生产 df 的行数较少,我不知道为什么。任何有关如何加快速度的建议将不胜感激。
【问题讨论】:
标签: python performance numpy pandas dataframe