我的问题是关于使用Python 2.7.9中的Pandas模块进行索引的速度。我正在使用Pandas 0.12.0,因为所有版本都高于0.12.0,因为我使用的数据帧缺少列值(即使链式索引警告关闭),链式索引也会变慢。这是指向csv的链接(' TESTDF.csv')
python输入:
import pandas as pd
import numpy as np
import time
#importing raw data
Rawdf = pd.read_csv('TESTDF.csv')
# chained 1
t = time.time()
Rawdf['MONTH']=None
for i in range(0,1000):
Rawdf['MONTH'][i] = int(Rawdf['DATE'][i][0:2].replace('/',''))
elapsed = time.time() - t
print elapsed
# unchained 1
t = time.time()
Rawdf['MONTH'] = None
for i in range(0,1000):
Rawdf.loc[i,'MONTH'] = int(Rawdf.loc[i,'DATE'][0:2].replace('/',''))
elapsed = time.time() - t
print elapsed
# unchained 2
t = time.time()
Rawdf['MONTH'] = None
#ADD MONTH, DAY, YEAR, and HOUR columns
for i in range(0,1000):
Rawdf.loc[i,'MONTH'] = int(Rawdf.loc[i,'DATE'][0:2].replace('/',''))
elapsed = time.time() - t
print elapsed
# chained 2
t = time.time()
Rawdf['MONTH']=None
#ADD MONTH, DAY, YEAR, and HOUR columns
for i in range(0,1000):
Rawdf['MONTH'][i] = int(Rawdf['DATE'][i][0:2].replace('/',''))
elapsed = time.time() - t
print elapsed
这是我的python输出:
0.0684299468994
9.38544201851
8.49306797981
0.0324759483337
正如您所看到的,链接速度要快得多。为什么会出现这样的速度差异?我很确定它与csv中缺少的列值有关,有趣的是,它可以产生很大的不同。
答案 0 :(得分:0)
(来自pandas v15.2的结果,完全使用上面的Eric代码(除了nrows=1000
使用read_csv()
,因为其余代码只使用前1000行。如果这很重要,那么我认为代码应该更改为使用超过前1000行,因为在没有真正原因的情况下读取大型csv会有点痛苦。此外,您可以使用date_range重新创建csv。
25.5060670376 # chained 1
1.0301091671 # unchained 1
1.3660838604 # unchained 2
26.4075160027 # chainedd 2
(注意:这里的代码是基于自编辑后的问题的先前版本,但我相信这些点仍然有效,所以我将其留在这里)
扩展@EdChum正在制作的优点......在ipython中这样做要容易得多,而且两种方法之间的区别更接近(而且你不必担心这种顺序的排序):
In [11]: pd.__version__
Out[11]: '0.15.2'
%timeit for i in range(0,6000,3): df.loc[i,'test']=666
1 loops, best of 3: 578 ms per loop
%timeit for i in range(0,6000,3): df['test'][i]=666
1 loops, best of 3: 220 ms per loop
我不打算将'test'重置为None,但这对时间来说并不重要(因为你反复重写)。而且,我不知道你最终试图测量什么,但是如果你对上面的代码进行矢量化(你想在实际的应用程序中做),这两种方法的速度基本相同(更不用说1000x左右)比非矢量化版本更快):
%timeit df.ix[0:6000:3,'test']=666
1000 loops, best of 3: 348 µs per loop
%timeit df['test'][0:6000:3]=666
1000 loops, best of 3: 352 µs per loop
Btw,自12.0以来已经有很多性能提升,很难相信你最好只有4个版本。如果您发现某些情况需要链接索引以获得速度,您可能希望在此处发布该特定示例而不是此示例测试。我认为这里的人很可能会有一个方法,就像你用链式索引一样快。