我想获得感兴趣的行之间的时间差异。
t = pd.data_range('1/1/2000', period=6, freq='D')
d = pd.DataFrame({'sid':['a']*3 + ['b']*3,
'src':['m']*3 + ['t']*3,
'alert_v':[1,0,0,0,1,1]}, index=rng)
我想获得alr
== 1的行之间的时差。
我尝试过移动,但还有其他方法可以消除列中两行之间的差异吗?
我尝试过简单的lambdas和更复杂的.loc:
`
def deltat(g):
g['d1'] = g[ g['alert_v']==1 ]['timeindex'].shift(1)
g['d0'] = g[ g['alert_v']==1 ]['timeindex']
return g['td'] = g['d1'] - g['d0']
d['td'] = d.groupby('src','sid').apply(lambda x: deltat(x) )
def indx(g):
d0 = g.loc[g['alert_v']==1 ]
d1[0] = d0[0]
d1.append( d0[:-1] )
g['tavg'] = g.apply( g.ix[d1,'timeindex'] - g.ix[d0,'timeindex'])
return g
在尝试了一堆方法后,我似乎无法通过多组或过滤问题...
最好的办法是什么?
编辑:
diff(1)
产生此错误:
raise TypeError('incompatible index of inserted column '
TypeError: incompatible index of inserted column with frame index
而shift(1)
产生此错误:
ZeroDivisionError: integer division or modulo by zero
尝试清理数据,而不是帮助。
if any( pd.isnull( g['timeindex'] ) ):
print '## timeindex not null'
g['timeindex'].fillna(method='ffill')
答案 0 :(得分:0)
对于 多索引组,选择行,差异和插入新列 范例:这就是我如何使用干净输出
shift会引发键错误,所以只需坚持使用diff()
# -- get the interarrival time
def deltat(g):
try:
g['tavg'] = g[ g['alert_v']==1 ]['timeindex'].diff(1)
return g
except:
pass
d.sort_index(axis=0, inplace=True)
d = d.groupby(['source','subject_id','alert_t','variable'],as_index=False,group_keys=False).apply( lambda x: deltat(x) )
print d[d['alert_v']==1][['timeindex','tavg']]