在python中按特定年份对数据进行分组

时间:2018-04-07 05:42:28

标签: python pandas aggregate pandas-groupby

我想创建一个按地区和日期分组的数据框,该数据框显示特定年份内某个地区的平均年龄。所以我的coloumns看起来像

  

地区,年份,平均年龄

到目前为止,我有:

#specify aggregation functions to column'age'    
ageAverage = {'age':{'average age':'mean'}} 

#groupby and apply functions    
ageDataFrame = data.groupby(['Region', data.Date.dt.year]).agg(ageAverage)

这很有效,但我怎样才能这样做,以便我只对特定年份的数据进行分组?例如在2010年和2015年之间说?

2 个答案:

答案 0 :(得分:3)

您需要先between过滤:

ageDataFrame = (data[data.Date.dt.year.between(2010, 2015)]
                  .groupby(['Region', data.Date.dt.year])
                  .agg(ageAverage))

同样在last version of pandas 0.22.0获取:

  

SpecificationError:无法使用嵌套字典重命名年龄

正确的解决方案是在groupby之后指定列表中的列,并按tuple聚合 - 第一个值是新列名称和第二个聚合函数:

np.random.seed(123)

rng = pd.date_range('2009-04-03', periods=10, freq='13M')
data = pd.DataFrame({'Date': rng,
                     'Region':['reg1'] * 3 + ['reg2'] * 7,
                     'average age': np.random.randint(20, size=10)})  
print (data)
        Date Region  average age
0 2009-04-30   reg1           13
1 2010-05-31   reg1            2
2 2011-06-30   reg1            2
3 2012-07-31   reg2            6
4 2013-08-31   reg2           17
5 2014-09-30   reg2           19
6 2015-10-31   reg2           10
7 2016-11-30   reg2            1
8 2017-12-31   reg2            0
9 2019-01-31   reg2           17

ageAverage = {('age','mean')}

#groupby and apply functions    
ageDataFrame = (data[data.Date.dt.year.between(2010, 2015)]
                 .groupby(['Region', data.Date.dt.year])['average age']
                 .agg(ageAverage))
print (ageDataFrame)
             age
Region Date     
reg1   2010    2
       2011    2
reg2   2012    6
       2013   17
       2014   19
       2015   10

答案 1 :(得分:1)

使用@ jezrael的数据(thx)的两种变体
这些与@jezrael已经展示的非常接近。只能将其视为可以做其他事情的演示。正如@jezrael的评论中指出的那样,最好先进行预过滤,因为它会减少整体处理。

pandas.IndexSlice

而不是使用between

进行预过滤
data.groupby(
    ['Region', data.Date.dt.year]

)['average age'].agg(
    [('age', 'mean')]

).loc[pd.IndexSlice[:, 2010:2015], :]

             age
Region Date     
reg1   2010    2
       2011    2
reg2   2012    6
       2013   17
       2014   19
       2015   10

between作为groupby

的一部分
data.groupby(
    [data.Date.dt.year.between(2010, 2015),
     'Region', data.Date.dt.year]

)['average age'].agg(
    [('age', 'mean')]

).loc[True]

             age
Region Date     
reg1   2010    2
       2011    2
reg2   2012    6
       2013   17
       2014   19
       2015   10