【问题标题】:Upsample in pandas multi-index熊猫多索引中的上采样
【发布时间】:2018-07-17 20:27:08
【问题描述】:

我正在尝试在分组的 DataFrame 中进行上采样,但不确定如何使其仅在组内进行上采样。我有一个看起来像这样的 DataFrame:

cat      weekstart                  date      
0.0      2016-07-04 00:00:00+00:00  2016-07-04    1
                                    2016-07-06    1
                                    2016-07-07    2
         2016-08-15 00:00:00+00:00  2016-08-16    1
                                    2016-08-19    1
         2016-09-19 00:00:00+00:00  2016-09-20    1
                                    2016-09-21    1
         2016-12-19 00:00:00+00:00  2016-12-19    1
                                    2016-12-21    1

1.0      2016-07-25 00:00:00+00:00  2016-07-26    2
         2016-08-01 00:00:00+00:00  2016-08-03    1
         2016-08-08 00:00:00+00:00  2016-08-12    1

如果我执行 df.unstack().fillna(0).stack() 之类的操作会导致:

cat      weekstart                  date      
0.0      2016-07-04 00:00:00+00:00  2016-1-1      0 
                                           .
                                           .
                                           .
                                    2016-07-04    1
                                    2016-07-06    1
                                    2016-07-07    2

因为日期列中的最小值是 2016-1-1。我所追求的只是在每个“cat”和“weekstart”中采样工作日,例如:

 cat      weekstart                  date      
 0.0      2016-07-04 00:00:00+00:00  2016-07-04    1
                                     2016-07-05    0 
                                     2016-07-06    1
                                     2016-07-07    2
                                     2016-07-8     0
          2016-08-15 00:00:00+00:00  2016-08-15    0
                                     2016-08-16    1
                                     2016-08-17    0
                                     2016-08-18    0
                                    2016-08-19    1

我尝试过使用:

 level_values = df.index.get_level_values
 df.groupby(
            [level_values(i) for i in [0, 1]] + [pd.Grouper('B', level=-1)]
            )
    .sum()

但它没有按预期工作。

【问题讨论】:

    标签: python pandas pandas-groupby


    【解决方案1】:

    我认为您需要由MultiIndex 创建的reindexbdate_range 创建的自定义函数:

    def f(x):
        lvl0 = x.index.get_level_values(0)[0]
        lvl1 = x.index.get_level_values(1)[0]
        lvl2 = pd.bdate_range(start=lvl1, periods=5)
        mux = pd.MultiIndex.from_product([[lvl0], [lvl1], lvl2], names=x.index.names)
        return (x.reindex(mux, fill_value=0))
    
    s1 = s.groupby(['cat','weekstart'], group_keys=False).apply(f)
    

    print (s1)
    
    cat  weekstart   date      
    0.0  2016-07-04  2016-07-04    1
                     2016-07-05    0
                     2016-07-06    1
                     2016-07-07    2
                     2016-07-08    0
         2016-08-15  2016-08-15    0
                     2016-08-16    1
                     2016-08-17    0
                     2016-08-18    0
                     2016-08-19    1
         2016-09-19  2016-09-19    0
                     2016-09-20    1
                     2016-09-21    1
                     2016-09-22    0
                     2016-09-23    0
         2016-12-19  2016-12-19    1
                     2016-12-20    0
                     2016-12-21    1
                     2016-12-22    0
                     2016-12-23    0
    1.0  2016-07-25  2016-07-25    0
                     2016-07-26    2
                     2016-07-27    0
                     2016-07-28    0
                     2016-07-29    0
         2016-08-01  2016-08-01    0
                     2016-08-02    0
                     2016-08-03    1
                     2016-08-04    0
                     2016-08-05    0
         2016-08-08  2016-08-08    0
                     2016-08-09    0
                     2016-08-10    0
                     2016-08-11    0
                     2016-08-12    1
    Name: a, dtype: int64
    

    设置

    d = {(0.0, pd.Timestamp('2016-07-04 00:00:00'), pd.Timestamp('2016-07-07 00:00:00')): 2, (1.0, pd.Timestamp('2016-07-25 00:00:00'), pd.Timestamp('2016-07-26 00:00:00')): 2, (0.0, pd.Timestamp('2016-08-15 00:00:00'), pd.Timestamp('2016-08-16 00:00:00')): 1, (0.0, pd.Timestamp('2016-07-04 00:00:00'), pd.Timestamp('2016-07-04 00:00:00')): 1, (0.0, pd.Timestamp('2016-09-19 00:00:00'), pd.Timestamp('2016-09-20 00:00:00')): 1, (0.0, pd.Timestamp('2016-09-19 00:00:00'), pd.Timestamp('2016-09-21 00:00:00')): 1, (0.0, pd.Timestamp('2016-12-19 00:00:00'), pd.Timestamp('2016-12-19 00:00:00')): 1, (1.0, pd.Timestamp('2016-08-08 00:00:00'), pd.Timestamp('2016-08-12 00:00:00')): 1, (0.0, pd.Timestamp('2016-07-04 00:00:00'), pd.Timestamp('2016-07-06 00:00:00')): 1, (1.0, pd.Timestamp('2016-08-01 00:00:00'), pd.Timestamp('2016-08-03 00:00:00')): 1, (0.0, pd.Timestamp('2016-12-19 00:00:00'), pd.Timestamp('2016-12-21 00:00:00')): 1, (0.0, pd.Timestamp('2016-08-15 00:00:00'), pd.Timestamp('2016-08-19 00:00:00')): 1}
    s = pd.Series(d).rename_axis(['cat','weekstart','date'])    
    print (s)
    cat  weekstart   date      
    0.0  2016-07-04  2016-07-04    1
                     2016-07-06    1
                     2016-07-07    2
         2016-08-15  2016-08-16    1
                     2016-08-19    1
         2016-09-19  2016-09-20    1
                     2016-09-21    1
         2016-12-19  2016-12-19    1
                     2016-12-21    1
    1.0  2016-07-25  2016-07-26    2
         2016-08-01  2016-08-03    1
         2016-08-08  2016-08-12    1
    dtype: int64
    

    【讨论】:

    • 您是使用pandas.read_clipboard() 复制OP 的原始数据框还是必须手动创建它?我正在努力使用read_clipboard。谢谢。
    • 不用担心,谢谢你让我知道,所以我不需要再挠头了:>
    • 但是 maxu 创建了很好的解决方案,但我没有测试它 - link
    • 通过在本地保存 MaxU 的版本并以 read_clipboard_mi()read_clipboard_mi(index_names_row=1)read_clipboard_mi(index_names_row=0) 的身份运行,使用 OP 的数据框快速完成了一项操作,它们对我不起作用,但这是我们可以做的很棒的工作改进:)
    • 我从来不知道读取剪贴板,已经对 cme​​ts 有用:-)。当我尝试 df.groupby(['cat','weekstart'], group_keys=False).apply(f) 时,它会在 lvl1 = x.index.get_level_values(1)[0] 处引发 IndexError 抱怨它只有一个级别?
    猜你喜欢
    • 2014-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-06
    • 2019-07-04
    • 2016-10-16
    • 2019-01-19
    • 2016-11-25
    相关资源
    最近更新 更多