重新取样每组中的pandas df

时间:2018-06-01 05:30:55

标签: python python-3.x pandas

我有一个MultiIndex (id, date)的df,我想做两件事:

  1. 将名为DateTimeIndex的{​​{1}}转换为每个date组中的PeriodIndex

  2. id每日resample每月的频率

  3. 我当前的(非工作)方法是(甚至在转换为PeriodIndex之前):

    PeriodIndex

    这引起了:

    df = pd.DataFrame(data = {"val": np.arange(30), 
                              "id": np.tile([1,2], 15),
                              "date": np.repeat(pd.date_range(start = "2000-01-01", periods = 15, name="date"), 2)
                             })
    
    df = df.set_index(["id", "date"]).sort_index() 
    df.groupby("id")["val"].resample(rule = "M", closed = "right", label = "right").apply(lambda x: np.sqrt(sum(x)/10))
    

    完成整个程序的正确方法是什么?我对如何考虑TypeError: Only valid with DatetimeIndex, TimedeltaIndex or PeriodIndex, but got an instance of 'MultiIndex' 感到困惑:我的心理模型是groupby操作后的任何内容都只会收到与该组相对应的子帧(即groupby成为该特定组中仅MultiIndex的单个索引。这不正确吗?

1 个答案:

答案 0 :(得分:2)

如果在DatetimeIndex之前设置groupby是必要apply,则resample也不是必需的,sum Series的速度更快,然后划分最终np.sqrt乘以10,然后使用df = df.set_index(["date"]).sort_index() df1 = (np.sqrt(df.groupby("id")["val"] .resample(rule = "M", closed = "right", label = "right") .sum() .div(10))) print (df1) id date 1 2000-01-31 4.582576 2 2000-01-31 4.743416 Name: val, dtype: float64

{{1}}