大熊猫,链式索引,csv中的空格和速度

时间:2015-03-29 20:39:33

标签: python-2.7 indexing pandas

我的问题是关于使用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中缺少的列值有关,有趣的是,它可以产生很大的不同。

1 个答案:

答案 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个版本。如果您发现某些情况需要链接索引以获得速度,您可能希望在此处发布该特定示例而不是此示例测试。我认为这里的人很可能会有一个方法,就像你用链式索引一样快。