Python 数据帧中筛选值的最快方法
可以创建类似的数据帧:Python 数据帧中筛选值的最快方法,python,pandas,dataframe,indexing,filter,Python,Pandas,Dataframe,Indexing,Filter,可以创建类似的数据帧: import pandas as pd df = pd.DataFrame() df["nodes"] = list(range(1, 11)) df["x"] = [1,4,9,12,27,87,99,121,156,234] df["y"] = [3,5,6,1,8,9,2,1,0,-1] df["z"] = [2,3,4,2,1,5,9,99,78,1] df.set_index(&
import pandas as pd
df = pd.DataFrame()
df["nodes"] = list(range(1, 11))
df["x"] = [1,4,9,12,27,87,99,121,156,234]
df["y"] = [3,5,6,1,8,9,2,1,0,-1]
df["z"] = [2,3,4,2,1,5,9,99,78,1]
df.set_index("nodes", inplace=True)
因此,数据帧如下所示:
x y z
nodes
1 1 3 2
2 4 5 3
3 9 6 4
4 12 1 2
5 27 8 1
6 87 9 5
7 99 2 9
8 121 1 99
9 156 0 78
10 234 -1 1
我的第一次搜索尝试(例如,包含编号1的所有节点)是:
>>> df[(df == 1).any(axis=1)].index.values
[1 4 5 8 10]
由于我必须对许多数字进行此操作,并且我的实际数据帧比这个大得多,因此我正在寻找一种非常快速的方法来完成此操作。刚刚尝试了一些可能会有所启发的方法
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randint(0,100,size=(10000, 4)), columns=list('ABCD'))
df.set_index("A", inplace=True)
df_no_index = df.reset_index()
因此,在整个过程中设置一个带有int的数据帧。这和你的不一样,但足够了
然后我做了四次测试
%timeit df[(df == 1).any(axis=1)].index.values
%timeit df[(df['B'] == 1) | (df['C']==1)| (df['D']==1)].index.values
%timeit df_no_index[(df_no_index == 1).any(axis=1)].A.values
%timeit df_no_index[(df_no_index['B'] == 1) | (df_no_index['C']==1)| (df_no_index['D']==1)].A.values
我得到的结果是
940 µs ± 41.4 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
1.47 ms ± 7.34 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
1.08 ms ± 14.6 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
1.55 ms ± 51.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
这表明,您最初采用的方法,即索引,似乎是这些方法中最快的。删除索引不会提高中等大小数据帧的速度好的,非常感谢!所以我已经实现了最快的一个^^