在pandas groupby中聚合日期的有效方法

时间:2016-07-08 08:29:47

标签: python pandas aggregate

在日期(object)上执行groupby时,我意识到它的效率低于int。这是一个例子:

df = pd.DataFrame({'id1':[1,1,1,1,2,2,2,3,3,3],'id2':[10,20,30,10,20,30,10,20,30,10],'value':[123,156,178,19,354,26,84,56,984,12],
                   'date':['2015-01-12','2014-09-27','2014-10-14','2010-11-26','2010-04-09','2012-12-21','2009-08-16',
                          '2013-07-09','2014-02-14','2012-12-04']})
df

Out[1]:
    date        id1 id2 value
0   2015-01-12  1   10  123
1   2014-15-27  1   20  156
2   2014-10-14  1   30  178
3   2010-11-26  1   10  19
4   2010-04-09  2   20  354
5   2012-12-21  2   30  26
6   2009-08-16  2   10  84
7   2013-07-09  3   20  56
8   2014-02-14  3   30  984
9   2012-12-04  3   10  12

以下是列的类型:

df.dtypes

Out[2]:
date     object
id1       int64
id2       int64
value     int64
dtype: object

现在让我们来看看聚合效率::

%timeit df.groupby(['id1','id2']).agg({'value':np.sum})
1000 loops, best of 3: 1.35 ms per loop

%timeit df.groupby(['id1','id2']).agg({'date':np.max})
100 loops, best of 3: 2.75 ms per loop

正如您所看到的,它date的长度是value的两倍,这对于大数据帧来说是不方便的。

有没有办法在日期更有效地执行agg?也许通过更改date列的类型,或使用其他函数获取最大值?

1 个答案:

答案 0 :(得分:2)

将dtype更改为datetime可为我提供可比较的性能:

In [86]:
df['date'] = pd.to_datetime(df['date'], format='%Y-%m-%d')
df

Out[86]:
        date  id1  id2  value
0 2015-01-12    1   10    123
1 2014-09-27    1   20    156
2 2014-10-14    1   30    178
3 2010-11-26    1   10     19
4 2010-04-09    2   20    354
5 2012-12-21    2   30     26
6 2009-08-16    2   10     84
7 2013-07-09    3   20     56
8 2014-02-14    3   30    984
9 2012-12-04    3   10     12

In [88]:
# with datetime dtype    
%timeit df.groupby(['id1','id2']).agg({'value':np.sum})
%timeit df.groupby(['id1','id2']).agg({'date':np.max})
1000 loops, best of 3: 1.56 ms per loop
1000 loops, best of 3: 1.33 ms per loop

In [91]:
# with `str` dtype    
%timeit df.groupby(['id1','id2']).agg({'value':np.sum})
%timeit df.groupby(['id1','id2']).agg({'date':np.max})
1000 loops, best of 3: 1.56 ms per loop
100 loops, best of 3: 3.07 ms per loop

因此,使用datetime dtype,agg性能与'value'列聚合性能相当。