Python 以尽可能快的方式从dataframe中删除值
我有一个超过5百万行的数据帧。我还有一个要从数据帧中删除的值列表。假设我的列表名是Python 以尽可能快的方式从dataframe中删除值,python,python-3.x,pandas,Python,Python 3.x,Pandas,我有一个超过5百万行的数据帧。我还有一个要从数据帧中删除的值列表。假设我的列表名是a,数据帧名是df。下面是我用来检查a中的项目是否存在于df中的代码,然后将其从df中删除: if len(a) > 0: for i in tqdm(a): indexName = df[ df['id'] == i ].index df.drop(indexName , inplace=True) 以上代码需要5分钟。虽然有效,但我确信
a
,数据帧名是df
。下面是我用来检查a
中的项目是否存在于df
中的代码,然后将其从df
中删除:
if len(a) > 0:
for i in tqdm(a):
indexName = df[ df['id'] == i ].index
df.drop(indexName , inplace=True)
以上代码需要5分钟。虽然有效,但我确信有一种更有效的方法。如果你有任何想法,请分享 for循环调用
df.drop
多次,这是无效的。您可以使用一次呼叫来完成此操作
考虑:
values_to_delete = [5, 6, 7]
df = pd.DataFrame({'a': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]})
df.drop(df[df['a'].isin(values_to_delete)].index, inplace=True)
print(df)
输出
a
0 1
1 2
2 3
3 4
7 8
8 9
9 10
1.0248285
0.5842238000000002
0.24234719999999932
适应您的代码:
df.drop(df[df['id'].isin(tqdm(a))].index , inplace=True)
更快的选择 (见下面的时间安排) 可以在数据框中筛选所需的值,而不是删除不需要的值:
df = df[~df['id'].isin(tqdm(a))] # note the ~ which acts as NOT operator
时间安排 输出
a
0 1
1 2
2 3
3 4
7 8
8 9
9 10
1.0248285
0.5842238000000002
0.24234719999999932
(基本上)对于500000行的示例数据帧,每个方法(OP、一次调用和筛选的丢弃)尝试5次。过滤方法通常快75%。刚刚检查过,这需要几毫秒才能完成任务。谢谢有没有可能用
timeit
或其他什么东西来增加相对速度?@Engineero补充道