2013-11-26 78 views
4

我有一個很大的數字熊貓數據框df,我想選擇某些列的值在min_valuemax_value範圍內的行。如何通過大熊貓數據幀的列值加速行選擇

我可以做到這一點:

filtered_df = df[(df[col_name].values >= min_value) & (df[col_name].values <= max_value)] 

而且我正在尋找方法來加快速度。我嘗試如下:

df.sort(col_name, inplace=True) 
left_idx = np.searchsorted(df[col_name].values, min_value, side='left') 
right_idx = np.searchsorted(df[col_name].values, max_value, side='right') 
filtered_df = df[left_idx:right_idx] 

但它不起作用的df.sort()花費更多的時間。

那麼,任何提示加快選擇?

(熊貓0.11)

+0

您最初的查詢可以改寫作爲'filtered_df = df [(df [col_name]> = min_value)&(df [col_name] <= max_value]]'我認爲這是正確的做法。它應該工作在線性(O(N))時間與(通常)在O(N * logN)中工作的排序。 OTOH如果您多次進行這樣的選擇,您可以只進行一次排序,然後使用排序的DF進行選擇。 –

+1

@RomanPekar:我認爲通過'.values'會更快,因爲沒有索引開銷。 – DSM

+0

@DSM謝謝,這就是爲什麼我沒有添加答案:)仍然學習關於熊貓/ numpy的東西。你認爲有辦法加快OP任務嗎? –

回答

6

我認爲最好的方法是使用numexpr加快這

import pandas as pd 
import numpy as np 
import numexpr as ne 

data = np.random.normal(size=100000000) 
df = pd.DataFrame(data=data, columns=['col']) 
a = df['col'] 
min_val = a.min() 
max_val = a.max() 
expr = '(a >= min_val) & (a <= max_val)' 

而且時機...

%timeit eval(expr) 
1 loops, best of 3: 668 ms per loop 

%timeit ne.evaluate(expr) 
1 loops, best of 3: 197 ms per loop 
+1

這是什麼df.query(在0.13)是假設在引擎蓋下:) –

+0

所以我想「升級」將是更好的答案。 – JaminSore