【问题标题】:Quarterly mean by group按组划分的季度平均值
【发布时间】:2015-08-13 23:26:45
【问题描述】:

我有一个数据框,其中包含一组(区域)的每月观察值(var1、var2)

  date     var1     var2    Area

 2008-03-01 2       22      OH
 2008-02-01 3       33      OH
 2008-01-01 4       44      OH
 ... etc
 2008-03-01 111    1111     AK
 2008-02-01 222    2222     AK
 2008-01-01 333    3333     AK

我希望通过取 3 个月的平均值将这些变量“下采样”为季度数据。 IE。 'OH' 的第一个季度观测值 (var1) 应为 (1+3+4)/3。

如何在熊猫中做到这一点?谢谢

编辑:这是我想要的输出:

      dateQtr      var1     var2    Area

     2008-Q1        3        33       OH
     2007-Q4       ...        ...     OH    
     ... etc
     2008-Q1       222      2222     AK

【问题讨论】:

  • 这是你想要的吗? df.groupby('Area')[['var1','var2']].resample('q') 与@EdChum 的建议之一基本相同,但会保留日期。
  • @JohnE 是的,你的建议给了 OP 他们想要的东西,我已经更新了我的答案,我应该意识到在分组后执行 resample 应该可以工作
  • 很酷,对问答进行了很好的编辑。 ;-)
  • 只是一个小小的后续问题:当我们遇到像这样的问题可以通过某种groupby“魔术”解决时:你们如何着手找出正确的程序?我总是对大多数这些问题的单行答案感到惊讶。我自己永远无法想出df.groupby('Area')[['var1','var2']].resample('q').reset_index()...感谢您的任何指点...

标签: pandas


【解决方案1】:

如果您将索引设置为“日期”,那么您可以resample 每季度一次:

In [114]:    
df.resample('q')

Out[114]:
             var1    var2
date                     
2008-03-31  112.5  1127.5

所以在你现有的 df 上:

In [116]:    
df.set_index('date').resample('q', how='mean')

Out[116]:
             var1    var2
date                     
2008-03-31  112.5  1127.5

编辑

感谢@JohnE 指出这一点:

In [134]:    
df.groupby('Area')[['var1','var2']].resample('q').reset_index()

Out[134]:
  Area       date  var1  var2
0   AK 2008-03-31   222  2222
1   OH 2008-03-31     3    33

【讨论】:

  • 谢谢,当我在我的 DataFrame 上执行此操作时,我收到了DataError: No numeric types to aggregate。有什么想法吗?
  • 这意味着你的数据是字符串而不是数字,先试试这个df = df.convert_objects(convert_numeric=True)
  • 谢谢,这行得通,但我如何保留Area 列?
  • 所以也许你真的想要df.groupby([df.index.quarter, 'Area']).mean()然后在groupby对象上调用reset_index()
  • 谢谢,但后来我丢失了日期/季度信息,这并不容易:P
猜你喜欢
  • 1970-01-01
  • 2014-12-28
  • 2016-03-10
  • 2016-07-22
  • 2015-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多