2013-11-21 122 views
1

9I具有多索引数据帧,我想通过重新取样的3(意味着每3行成为一个)的因子,以减少数据点的频率。重新取样熊猫数据帧用“块大小” /“频率”

此:

    time value 
    ID measurement 
ET001   0  0  2 
       1 0.15  3 
       2 0.3  4 
       3 0.45  3 
       4 0.6  3 
       5 0.75  2 
       6 0.9  3 
ET002   0  0  2 
       1 0.16  5 
       2 0.32  4 
       3 0.45  3 
       4 0.6  3 
       5 0.75  2 

我想变成这样:

    time value 
    ID measurement 
ET001   0 0.15  3 
       1 0.6 2.7 
       2 0.9  3 
ET002   0 0.16 3.7 
       1 0.6 2.7 

我试图把我的时间列到像这样一个熊猫日期时间指数,然后再使用重采样:

df = df.set_index(pd.DatetimeIndex(timecourse_normed['Time'])) 
df = df.groupby(level=0).resample(rule='0.1S', how=np.mean) 

但是,第一行给我实际日期(1970出头),这是第二条线很无助。浏览arund堆栈溢出我发现了一些类似的quiestios,所有的解决方案都不是基于熊猫的resample解决方案 - 而且,可悲的是,我的用例不可行。

你能帮我一下吗?

+0

这里的关键是要分开你的问题,你真的有两个问题:对1970年一些小整型(因为这是具有划时代时间的开始),以及一些关于重新取样(它不工作是没有惊喜给出的第一个问题)。 –

+0

我不一定想通过日期时间转换来做到这一点,我只是提到我试过的方法。 - 我应该删除它吗? – TheChymera

+0

我不明白你如何得到你想要的结果(第一个是4.5)。 –

回答

3

我认为你的想法可能是 - 将每个ID中的记录分成3个记录(如SQL中的ntile(3)),并计算平均值。要创建这个数字,我们可以使用这样一个事实,即您已经有每行的序号 - measurement级别的索引。因此,我们可以仅仅通过3除以这个数字得到的数字,我们需要:

>>> df 
        time value ntile 
ID measurement     
ET001 0   0.00  2  0 
     1   0.15  3  0 
     2   0.30  4  0 
     3   0.45  3  1 
     4   0.60  3  1 
     5   0.75  2  1 
     6   0.90  3  2 
ET002 0   0.00  2  0 
     1   0.16  5  0 
     2   0.32  4  0 
     3   0.45  3  1 
     4   0.60  3  1 
     5   0.75  2  1 

所以我们可以使用辅助函数这样并将其应用到各组,从而获得所需结果。

>>> def helper(x): 
...  x = x.reset_index() 
...  x = x.groupby(x['measurement'].div(3)).mean() 
...  del x['measurement'] 
...  return x 
... 
>>> df.groupby(level=0).apply(helper) 
        time  value 
ID measurement     
ET001 0   0.15 3.000000 
     1   0.60 2.666667 
     2   0.90 3.000000 
ET002 0   0.16 3.666667 
     1   0.60 2.666667 

希望它有帮助。