Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 以尽可能快的方式从dataframe中删除值_Python_Python 3.x_Pandas - Fatal编程技术网

Python 以尽可能快的方式从dataframe中删除值

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分钟。虽然有效,但我确信

我有一个超过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补充道