2017-06-25 32 views
1

我有一個numpy數組(users_to_remove),包含用戶要刪除的數據(75000在該數組中)和一個熊貓數據框(訂單),我想從中刪除行包含thds的Ids。刪除數以百萬計的熊貓行,重複數組中的值

訂單約有3500萬行。

這裏是我目前着手:

for i in users_to_remove: 
    orders = orders[orders.user_id != i] 

其採取的年齡,仍然didnt完成。我有8GB的內存和一個四核i3與3,2ghz。

有沒有一種有效的方式來做到這一點與熊貓,我應該使用另一種語言?或者,我的電腦只是爲了減慢這一點?

謝謝

+0

或者是'users_to_remove'或'orders.user_id'排序? – Divakar

回答

3

我認爲你需要isinboolean indexing

orders = orders[~orders.user_id.isin(users_to_remove)] 

時序類似(但我只有4GB內存,i5處理器的2.5 GHz的Win7):

np.random.seed(100) 
N = 35000000 

users_to_remove = np.random.randint(75000, size=N) 
orders = pd.DataFrame({'user_id':np.random.randint(100000, size=N)}) 
print (orders.head()) 

In [54]: %timeit (orders[~orders.user_id.isin(users_to_remove)]) 
1 loop, best of 3: 16.9 s per loop 

In [55]: %timeit (orders[~np.in1d(orders.user_id.values, users_to_remove)]) 
1 loop, best of 3: 14.6 s per loop