Python 在pandas groupby中聚合日期的有效方法
在对日期执行groupby时(如Python 在pandas groupby中聚合日期的有效方法,python,pandas,aggregate,Python,Pandas,Aggregate,在对日期执行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
对象
),我意识到它的效率远远低于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
列的类型,或者通过使用另一个函数,获取最大值?将数据类型更改为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'
列聚合性能相当。通常日期应该是datetime
,但我注意到2014-15-27
不是有效日期,除非你使用了一些时髦的日历。事实上,我输入日期时考虑到了我的13号,显然是第14个月,也许是第15个月!换了。(请注意,date
列的类型仍然是object
,我怀疑这就是问题所在,因为python
无法为对象使用专用函数)好的,所以我们的想法确实是更改列的类型。我承认我对python中的date
的不同格式感到有点困惑,我必须看看它们。非常感谢。有一个方便的网站解释了strftime
格式字段:为什么实际需要agg()
?当我使用df.groupby(['id1','id2']).sum()
时,我得到了相同的结果。@Cleb我假设这只是一个示例代码位,OP可能在实际代码中使用agg
函数的实数列表或dict,或者在Tokhabi中使用agg
,这是有意义的;我只是想知道我是否错过了什么。