pandas multiindex在过滤值上移动

时间:2014-07-03 01:16:28

标签: python pandas

我想获得感兴趣的行之间的时间差异。

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') 

1 个答案:

答案 0 :(得分: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']]