我想计算持续时间(在变化之间的几周内)。例如,p在第1,2,3周相同,在第4期更改为1.11。因此持续时间为3.现在持续时间是在从R移植的循环中计算的。它可以工作但速度很慢。任何建议如何改善这一点将不胜感激。
raw['duration']=np.nan
id=raw['unique_id'].unique()
for i in range(0,len(id)):
pos1= abs(raw['dp'])>0
pos2= raw['unique_id']==id[i]
pos= np.where(pos1 & pos2)[0]
raw['duration'][pos[0]]=raw['week'][pos[0]]-1
for j in range(1,len(pos)):
raw['duration'][pos[j]]=raw['week'][pos[j]]-raw['week'][pos[j-1]]
数据框是原始的,特定unique_id的值如下所示。
date week p change duration
2006-07-08 27 1.05 -0.07 1
2006-07-15 28 1.05 0.00 NaN
2006-07-22 29 1.05 0.00 NaN
2006-07-29 30 1.11 0.06 3
... ... ... ... ...
2010-06-05 231 1.61 0.09 1
2010-06-12 232 1.63 0.02 1
2010-06-19 233 1.57 -0.06 1
2010-06-26 234 1.41 -0.16 1
2010-07-03 235 1.35 -0.06 1
2010-07-10 236 1.43 0.08 1
2010-07-17 237 1.59 0.16 1
2010-07-24 238 1.59 0.00 NaN
2010-07-31 239 1.59 0.00 NaN
2010-08-07 240 1.59 0.00 NaN
2010-08-14 241 1.59 0.00 NaN
2010-08-21 242 1.61 0.02 5
##
答案 0 :(得分:0)
计算duratiosn一旦你的日期顺序列表是微不足道的:迭代列表,跟踪自上次更改为p
以来的时间。如果缓慢来自您获取该列表的方式,那么您还没有提供足够的信息来获取帮助。
答案 1 :(得分:0)
您可以简单地获取有更改的周数列表,然后计算它们的差异,最后将这些差异重新加入到原始DataFrame中。
weeks = raw.query('change != 0.0')[['week']]
weeks['duration'] = weeks.week.diff()
pd.merge(raw, weeks, on='week', how='left')
答案 2 :(得分:0)
raw2=raw.ix[raw['change'] !=0,['week','unique_id']]
data2=raw2.groupby('unique_id')
raw2['duration']=data2['week'].transform(lambda x: x.diff())
raw2.drop('unique_id',1)
raw=pd.merge(raw,raw2,on=['unique_id','week'],how='left')
谢谢大家。我修改了建议并得到了与复杂循环相同的答案。 10,000。观察,它的速度并不快,但代码似乎更紧凑。
我没有对Nan进行任何更改,因为在没有进行任何更改时,持续时间似乎未定义。但是零也会起作用。使用上面的代码,NaN通过合并自动输入。在任何情况下, 我想分别计算非变更组的统计数据。