2013-12-18 4 views
7

몇 가지 고정 열 (최대 10 개 열)의 조건에 의해 결정되는 큰 판다 데이터 프레임 (수백만 행)의 행에 대해 집계 연산 (합계)을 만들고 싶습니다. 이러한 열은 정수 값만 갖습니다.데이터 프레임을 쿼리하는 가장 빠른 방법

제 문제는이 작업을 (쿼리 + 집계) 수천 번 (~ 10000 번) 수행해야한다는 것입니다. 집계 부분에는 단순한 합계만큼 최적화 할 것이별로 없다고 생각합니다. 이 작업을 수행하는 가장 효율적인 방법은 무엇입니까? 각 쿼리의 처리 속도를 높이기 위해 조건 열에 '인덱스'를 작성할 수있는 방법이 있습니까?

+4

을 안하지만, 수 조건에 대한 몇 가지 코드를 게시 하시겠습니까? 'all()'또는'and' 단락 회로를 사용하고 있습니까? 산술 연산을 사용하여 몇 가지 조건을 동시에 테스트 할 수 있습니까? – Roberto

+2

작전 시간을 정하고 실제로 시간을 내주는 것이 무엇인지 확인해야합니다. (예 : ipython에서''% prun/% timeit''을 사용하십시오). 판다의 많은 작업은 후드에서''numexpr''을 사용하여 색인 생성 속도가 매우 빠릅니다. – Jeff

+8

그들은 0.13의 몇 가지 새로운 기능 (0.13rc1이 나와 있음)을 유용하게 사용할 수 있습니다. http://pandas.pydata.org/pandas-docs/dev/enhancingperf.html#expression-evaluation-via-eval-experimental ; 당신은 또한 메모리 내 HDFStore를 시도 할 수 있습니다! http://pytables.github.io/cookbook/inmemory_hdf5_files.html (HDFStore에 addl 드라이버 인수를 전달하면됩니다) – Jeff

답변

1

나는이 맛에 뭔가하려고 할 것입니다 :

것은 당신이

N = 10000000 
df = pd.DataFrame({ 
    'A':np.random.binomial(1,0.5,N), 
    'B':np.random.binomial(2,0.5,N), 
    'nume1':np.random.uniform(0,1,N), 
    'nume2':np.random.normal(0,1,N)}) 

다음이

tmp = df[['A','B','nume1','nume2']].query('A > 0.5').groupby('B').sum().reset_index()[['B','nume1','nume2']] 

하고 다음 dataframe가 있다고 가정을의 SQL에 해당이됩니다

select B, sum(nume1),sum(nume2) 
from df 
where A > 0.5 
group by B 

보통 (i7 쿼드 코어, 16GB 램) 시스템에서 약간의 시간 (초당 926ms, % timeit 사용)이 소요됩니다.

이 정보가 도움이되기를 바랍니다.

1

자세한 내용이 없으면 질문에 답변하기가 어렵습니다.

실제로 조건부 열의 색인을 작성해야합니다.

df['idx'] = (df['col1'] * df['col2']) ** (df['col3'] + df['col4']) * df['col5'] == 0.012 
df = df.set_index('idx') 

색인이 가능한 열에 상태를 재 작성하는 것이 어려울 수 있습니다. 당신이 팬더 고급 색인에이 문서는 당신이 당신의 문제에 대해 생각하는 데 도움이 될 수 있습니다

df = df.set_index(['col1', 'col2', 'col3', 'col4', 'col5' ...]) 

인덱스로 모든 열을 설정할 수 있습니다 유의 사항 : 내가 전문가는 아니지만 것을 http://pandas.pydata.org/pandas-docs/stable/indexing.html#multiindex-query-syntax

관련 문제