【发布时间】:2015-06-02 18:45:30
【问题描述】:
我的问题是关于在 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
如您所见,chained 的速度要快得多。为什么会有这样的速度差异?我很确定这与 csv 中缺少列值有关,想象它会产生如此大的差异是很有趣的。
【问题讨论】:
-
我无法运行您的代码,如果您将顺序如此链式索引首先翻转然后正确的最后一个,会发生什么情况?通常,计时操作必须计算多次,并取最快时间的平均值以排除任何缓存
-
请在您的问题中编辑代码更新,因为格式在 cmets 中丢失,我刚刚运行该代码并得到
chained indexing processing time: 2.3311331272125244 non-chained indexing processing time: 2.579148054122925然后我翻转订单并得到:non-chained indexing processing time: 2.503142833709717 chained indexing processing time: 4.8432769775390625所以我没有看到和你一样大的不同,订单很重要 -
编辑您的问题并添加完整代码并删除您的评论
-
@EdChum 可能使用的是版本 15 或 16,而且很可能
loc自版本 12 以来性能有所改进。如果您有兴趣,可以查看发行说明。我的结果(15.2 版)肯定比你的更接近 Ed。 -
感觉这里有一个XY problem——与其试图找出过时版本的熊猫的行为方式,不如描述你的实际问题可能会更有成效(“这就是我所拥有的,这就是我想要的,这是我到目前为止所做的,但是它太慢了——有没有更好的方法?”)。例如,如果您只想将月、日、年和小时提取到列中,我敢打赌,我们可以在 modern pandas 中击败您的最佳时间。
标签: python-2.7 indexing pandas