【问题标题】:pandas reindex multiindex and shift values by second index熊猫重新索引多索引并按第二个索引移动值
【发布时间】:2018-11-24 19:31:53
【问题描述】:

我有一个看起来像这样的熊猫数据框:

                        x1             x2            x3            x4
Date       Time                                                               
2017-01-03 09:00:00      0.000097      0.000259      0.000629      0.000142   
           09:20:00      0.000046      0.000044      0.000247      0.000134   
           09:40:00      0.000021      0.000032      0.000171      0.000105   
           10:00:00      0.000033      0.000040      0.000136      0.000178   
           10:20:00      0.000079      0.000157      0.000094      0.000083
           .....
           17:00:00      0.000032      0.000137      0.000024      0.000028

但是,我想将第二个索引重新索引一个 20 分钟的 bin,我希望它看起来像这样:

                        x1             x2            x3            x4
Date       Time                                                               
2017-01-03 09:20:00      0.000097      0.000259      0.000629      0.000142   
           09:40:00      0.000046      0.000044      0.000247      0.000134   
           10:00:00      0.000021      0.000032      0.000171      0.000105   
           10:20:00      0.000033      0.000040      0.000136      0.000178   
           10:40:00      0.000079      0.000157      0.000094      0.000083
           .....
           17:20:00      0.000032      0.000137      0.000024      0.000028

所以所有值都保持不变,只有第二个索引被重命名,其他一切都保持不变。

我试过以下代码:

x.reindex(pd.date_range(pd.Timestamp('09:20:00'), pd.Timestamp('17:20:00'), freq="20min").time, level=1)

但它只是移动索引并且值保持在同一个位置。

                        x1             x2            x3            x4
Date       Time                                                               
2017-01-03 09:20:00      0.000046      0.000044      0.000247      0.000134   
           09:40:00      0.000021      0.000032      0.000171      0.000105   
           10:00:00      0.000033      0.000040      0.000136      0.000178   
           10:20:00      0.000079      0.000157      0.000094      0.000083
           .....
           17:00:00      0.000032      0.000137      0.000024      0.000028

它甚至没有为 17:20:00 的垃圾箱做广告。

但是,如果我也尝试在像这样分组后改变值:

x.groupby(level=1).shift(1)

或:

x.groupby(level=1).shift(1, freq='20min')

但这根本不起作用。

【问题讨论】:

    标签: python pandas multi-index


    【解决方案1】:

    我能想到的最快方法是用自身的 20 分钟移位版本覆盖 MultiIndex 的整个第一级(最内层):

    x.index = x.index.set_levels(x.index.levels[1].shift(20, 'min'), level=1)
    

    示例

    x = pd.DataFrame(index=pd.MultiIndex.from_product([pd.date_range('2017-01-03', '2017-01-06', freq='1D'), 
                                                       pd.date_range('09:00', '17:00', freq='20min')]))
    x.loc[:, 'x1'] = list(range(len(x)))
    
    x
                                    x1
    2017-01-03 2018-06-14 09:00:00   0
               2018-06-14 09:20:00   1
               2018-06-14 09:40:00   2
               2018-06-14 10:00:00   3
               2018-06-14 10:20:00   4
        ...                         ..
    2017-01-06 2018-06-14 15:40:00  95
               2018-06-14 16:00:00  96
               2018-06-14 16:20:00  97
               2018-06-14 16:40:00  98
               2018-06-14 17:00:00  99
    
    x.index = x.index.set_levels(x.index.levels[1].shift(20, 'min'), level=1)
    
    x
                                    x1
    2017-01-03 2018-06-14 09:20:00   0
               2018-06-14 09:40:00   1
               2018-06-14 10:00:00   2
               2018-06-14 10:20:00   3
               2018-06-14 10:40:00   4
        ...                         ..
    2017-01-06 2018-06-14 16:00:00  95
               2018-06-14 16:20:00  96
               2018-06-14 16:40:00  97
               2018-06-14 17:00:00  98
               2018-06-14 17:20:00  99
    

    【讨论】:

      猜你喜欢
      • 2021-08-28
      • 2016-06-13
      • 2021-09-01
      • 2015-02-22
      • 2021-11-28
      • 2020-11-09
      • 2016-10-16
      • 2019-01-19
      • 1970-01-01
      相关资源
      最近更新 更多