对groupby对象中的每个组应用重采样

1 投票
1 回答
1363 浏览
提问于 2025-04-18 05:30

我创建了一个方便的方法,可以对任意的数据框进行重采样:

def resample_data_to_hourly(df):
  df = df.resample('1H',how='mean',fill_method='ffill',
                           closed='left',label='left')
  return df

我想把这个函数应用到一个分组对象中的每个数据框上,像下面这样:

df.transform(resample_data_to_hourly)
df.aggregate(resample_data_to_hourly)
dfapply(resample_data_to_hourly)

我尝试了所有方法,但都没有成功。无论我怎么做,数据框都没有任何变化,即使我把上面的结果赋值给一个新的数据框(据我理解,这本不应该是必要的)。

我相信在处理带有时间序列数据的分组对象时,有一些简单而常见的方法是我没有掌握的,但我一直无法修正我的程序。

我该如何创建像上面那样的函数,并让它们正确地应用到分组对象上?如果我像处理字典那样逐个遍历每个组,并把结果添加到一个新的字典中,然后再转换回分组对象,我的代码就能正常工作,但这样做太麻烦了,我觉得我错过了很多Pandas能做的事情,因为我被迫使用这些笨拙的方法。

编辑:添加基础示例:

rng = pd.date_range('1/1/2000', periods=10, freq='10m')
df = pd.DataFrame({'a':pd.Series(randn(len(rng)), index=rng), 'b':pd.Series(randn(len(rng)), index=rng)})

结果是:

                       a         b
    2000-01-31  0.168622  0.539533
    2000-11-30 -0.283783  0.687311
    2001-09-30 -0.266917 -1.511838
    2002-07-31 -0.759782 -0.447325
    2003-05-31 -0.110677  0.061783
    2004-03-31  0.217771  1.785207
    2005-01-31  0.450280  1.759651
    2005-11-30  0.070834  0.184432
    2006-09-30  0.254020 -0.895782
    2007-07-31 -0.211647 -0.072757

df.groupby('a').transform(hour_resample) // should yield resampled data with both a and b columns
// instead yields only column b
// df.apply yields both columns but in this case no changes will be made to the actual matrix
// (though in this case no change would be made, sample data could be generated such that a change should be made)
// if someone could supply a reliable way to generate data that can be resampled, that would be wonderful

1 个回答

3

在编程中,有时候我们会遇到一些问题,可能是因为代码写得不够清晰,或者是我们对某些概念理解得不够透彻。比如,有人可能在使用某个函数时,发现它的表现和预期不一样,这时候就需要仔细检查代码,看看是不是哪里出错了。

另外,了解一些基本的编程概念,比如变量、循环和条件判断,能够帮助我们更好地理解代码的运行方式。这样,当我们遇到问题时,就能更快找到解决办法。

总之,编程就像解谜一样,有时候需要耐心和细心,才能找到问题的根源。

data.groupby(level=0)
    .apply(lambda d: d.reset_index(level=0, drop=True)
                      .resample("M", how=""))

撰写回答