2017-06-25 2 views
1

Ich habe ein numpy Array (users_to_remove) bestehend aus Benutzer-IDs zu entfernen (75000 in diesem Array), und ein Pandas Dataframe (Aufträge), von denen ich Zeilen entfernen möchte enthalten diese Ids.Löschen Millionen von Pandas Zeilen, wrt Werte in numpy Array

Bestellungen hat etwa 35 Millionen Zeilen.

Hier ist, wie ich zur Zeit gehen:

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

Sein Alter und immer noch nur knapp sein Ziel Finish nehmen. Ich habe 8 GB RAM und einen Quad Core i5 mit 3,2 GHz.

Gibt es einen effizienten Weg, dies mit Pandas zu tun, sollte ich eine andere Sprache verwenden? Oder ist mein Computer dafür nur langsam?

Danke

+0

entweder Ist von 'users_to_remove' oder' orders.user_id' sortiert? – Divakar

Antwort

3

Ich glaube, Sie brauchen isin mit boolean indexing:

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

Timings ähnlich sind (aber ich habe nur 4 GB RAM, 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 
Verwandte Themen