如何在MultiIndex DataFrame上实现非重叠滚动功能

时间:2016-07-28 12:24:26

标签: python python-3.x pandas

到目前为止,我已找到this question,但由于以下事实,它无法解决我的问题:

  1. 我有一个MultiIndex DataFrame
  2. 内层有每个外层的不同数据量,因此我无法使用len()
  3. 我有以下DataFrame

    Outer Inner    Value        
      A     1     2.000000
      A     2     4.000000
      A     3     6.000000
      A     4     8.000000
      B     1     3.000000
      B     2     6.000000
      B     3     9.000000
      B     4     12.000000
      B     5     15.000000
    

    我想以非重叠的方式对每个outer的最后两个值求和。因此,对于A,我想总结inner的3 + 4,1 + 2.对于B,我想要求inner的4 + 5,2 + 3注意,成对和应该从最后一个值开始。导致

    Outer Inner    Value        
      A     2     6.000000
      A     4    14.000000
      B     3    15.000000
      B     5    27.000000
    

2 个答案:

答案 0 :(得分:2)

具有自定义重新采样功能的Groupby

您很可能需要自定义重新取样才能执行此操作。这有点 hacky 但可能有用。

  1. 删除所有MulitIndex以处理常规列groupby() s
  2. groupby() 'Outer'.apply()每个群组的自定义功能
  3. 自定义功能需要一个组
    1. 确定组的均匀长度
    2. 向后选择该长度
    3. 将索引转为秒
    4. resample(...) .sum()
    5. 每两个样本重新采样DataFrame
    6. resample(...) Inner每两位重新对.last()列进行重新取样,以保留原始索引号
    7. 将索引转换回' Inner'
  4. 即使我们删除了MultiIndexMultiIndex
  5. 仍然会返回groupby(...).apply()

    注意: rolling存在问题,因为它幻灯片通过值而不是单步执行值(在非重叠方法中)。使用resample可以实现此目的。重新采样是基于时间的,索引需要表示为秒。

    实施例

    import math
    import pandas as pd
    
    df = pd.DataFrame({
        'Outer': ['A','A','A','A','B','B','B','B','B'],
        'Inner': [1,2,3,4,1,2,3,4,5],
        'Value': [2.00,4.00,6.00,8.00,3.00,6.00,9.00,12.00,15.00]
    })
    
    def f(g):
        even_length = int(2.0 * math.floor(len(g) / 2.0))
        every_two_backwards = g.iloc[-even_length:]
        every_two_backwards.index = pd.TimedeltaIndex(every_two_backwards.index * 1000000000.0)
        resample_via_sum = every_two_backwards.resample('2s').sum().dropna()
        resample_via_sum['Inner'] = every_two_backwards.resample('2s').last()
        resample_via_sum = resample_via_sum.set_index('Inner')
    
        return resample_via_sum
    
    resampled_df = df.groupby(['Outer']).apply(f)
    
    print resampled_df
    
                 Value
    Outer Inner       
    A     2.0      6.0
          4.0     14.0
    B     3.0     15.0
          5.0     27.0
    

答案 1 :(得分:0)

好的,卷起袖子,这需要一些工作:

foo bar baz