2016-07-08 20 views
2

日付でgroupbyを実行するとき(object)、それはintよりも効率が悪いことに気付きました。次に例を示します。ここではpandas groupbyの日付を集約する効率的な方法

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 

することができますようにそれはvalueの場合と同じようにdateの2倍であり、大きなデータフレームには不都合です。

aggをより効率的に実行する方法はありますか?多分date列のタイプを変更するか、別の関数を使ってmax? datetimeにDTYPEを変更

+0

通常、日付は 'datetime'でなければなりませんが、あなたがファンキーなカレンダーを使用していない限り、' 2014-15-27'は有効な日付ではないことに注意してください。 – EdChum

+0

実際に、私は13、14、明らかに!それを変更しました。 ( 'date'カラムの型はまだ' object'ですが、 'python'は' objects'に専用の関数を使うことができないので、これが問題であると思われます) – ysearka

答えて

2

は私のために匹敵PERFを与える:

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'カラム集約性能に匹敵します。

+0

確かに、列。 Pythonの 'date'のさまざまなフォーマットについて少し混乱していることは認めます。私はそれらを見なければなりません。ありがとうございました! – ysearka

+0

'strftime'フォーマットフィールドについて説明する便利なウェブサイトがあります:http://strftime.org/ – EdChum

+0

なぜ' agg() 'が実際に必要なのですか? 'df.groupby(['id1'、 'id2'])。sum()'を使うと、同じ結果が得られます。 – Cleb

関連する問題