这段代码看起来对我来说,但是它让我跑了很长时间。
在这两种情况下,我都处理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()
答案 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
但是很难知道你还没有看到你的输入/输出。