我有一个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。
有没有一种有效的方法来做大熊猫,我应该使用另一种语言吗?或者我的电脑是为了减速呢?
谢谢
答案 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