在numpy数组

时间:2017-06-25 09:39:29

标签: python arrays pandas numpy

我有一个numpy数组(users_to_remove),包括要移除的用户ID(在该数组中为75000),以及一个pandas数据帧(订单),我想从中删除包含Ids的行。

订单大约有3500万行。

以下是我目前的工作方式:

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

它花了很多年,仍然没有完成。我有8GB的ram和一个带有3,2ghz的四核i5。

有没有一种有效的方法来做大熊猫,我应该使用另一种语言吗?或者我的电脑是为了减速呢?

谢谢

1 个答案:

答案 0 :(得分:3)

我认为isin需要boolean indexing

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

时间相似(但我只有4GB 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