提高速度/优化此代码

时间:2015-07-15 17:18:43

标签: python performance pandas

这段代码看起来对我来说,但是它让我跑了很长时间。

在这两种情况下,我都处理78k行数据。我设法将列减少到2-4以简化代码。在这里,我单独留下第一列和第二列,并尝试用衍生物替换第三列。 我会每月一次,直到ProjID发生变化,告诉代码

for j in range (1,len(joined)):
    if joined['ProjID'][j] == joined['ProjID'][j-1]:
        joined.loc[j]=[joined.ProjID[j], joined.Month[j], (askingrent[j]-askingrent[j-1])/askingrent[j-1]]
    else:
        joined.loc[j]=[joined.ProjID[j], joined.Month[j], 0]

在这里,我再次拥有78k行。但是,我试图简单地将列转换为datetime并删除时间(小时和分钟)。代码看起来很简单;但是我已经等了30分钟〜是啊。速度与代码或其他内容相关吗?

ageofbuildings['Month']=pd.to_datetime(ageofbuildings['Month'])
for i in range (0, len(ageofbuildings)):
    ageofbuildings.Month[i]=ageofbuildings.Month[i].date()

1 个答案:

答案 0 :(得分:3)

您需要使用矢量化操作来加快代码速度。首先,看起来'Month''ProjID'列都是自己分配if子句是否为True,因此这是多余的。 等同于if子句的向量是

same_as_prev = joined['ProjID'] == joined['ProjID'].shift()

要将矢量值设为sub,可以执行

values = askingrent / askingrent.shift() - 1

假设askingrent是熊猫系列。然后就可以了

joined.iloc[:, 2] = np.where(same_as_prev, values, 0)

我认为第二个代码块可以通过

来实现
ageofbuildings['Month'] = pd.DatetimeIndex(ageofbuildings['Month']).date

但是很难知道你还没有看到你的输入/输出。