2016-07-08 1 views
2

날짜에 groupby를 수행 할 때 (object처럼) 나는 int보다 효율성이 떨어지는 것을 깨달았습니다. 의는 집계의 효율성 ::팬더 그룹의 날짜를 효과적으로 집계하는 방법

%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 

당신이 수에 대해 살펴 보겠습니다 지금

df.dtypes 

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

그리고 다음은

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 

이 컬럼의 종류 예를 들면 다음과 같습니다 두 번째로 date의 경우는 value이므로 큰 데이터 프레임은 불편합니다.

agg을 날짜에보다 ​​효율적으로 수행 할 수있는 방법이 있습니까? 어쩌면 date 열의 유형을 변경하거나 다른 기능을 사용하여 최대 값을 얻을 수 있습니까? datetime에 DTYPE 변경

+0

정상적으로 날짜는'datetime'이어야합니다. 그러나 펑키 캘린더를 사용하지 않는 한'2014-15-27'은 유효한 날짜가 아닙니다. – EdChum

+0

실제로 제 13 번째, 14 번째, 15 번째 월을 생각해 보았습니다. 분명히! 그것을 바꿨습니다. ('date' 컬럼의 타입은 여전히'object'입니다. 왜냐하면'python'은'objects'에 대해 전용 함수를 사용할 수 없기 때문에 이것이 문제라고 생각합니다.) – ysearka

답변

2

나를 위해 비슷한 반환 한을 제공하십시오 agg 성능이 'value' 열 집계 성능에 필적 D- 타입 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 

.

+0

좋습니다. 실제로 아이디어는 타입을 변경하는 것이 었습니다. 란. 나는 파이썬에서'date'의 다른 형식에 대해 혼란스러워하는 것을 인정합니다. 나는 그것들을 살펴 봐야 할 것입니다. 고맙습니다! – ysearka

+0

'strftime' 포맷 필드를 설명하는 편리한 웹 사이트가 있습니다 : http://strftime.org/ – EdChum

+0

왜'agg()'가 실제로 필요합니까? 'df.groupby ([ 'id1', 'id2']). sum()'을 사용하면 동일한 결과를 얻습니다. – Cleb

관련 문제