过滤熊猫数据框中值的最快方法

Posted

技术标签:

【中文标题】过滤熊猫数据框中值的最快方法【英文标题】:Fastest ways to filter for values in pandas dataframe 【发布时间】:2021-05-23 07:15:23 【问题描述】:

可以创建类似的数据框:

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]

由于我必须对许多数字执行此操作,并且我的真实数据框比这个大得多,因此我正在寻找一种非常快速的方法来执行此操作。

【问题讨论】:

【参考方案1】:

刚刚尝试了一些可能很有启发性的东西

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()

因此,在整个过程中设置一个带有整数的数据框。这和你的不一样,但足够了。

然后我进行了四次测试

%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)

这表明您采用 index 的初始方法似乎是这些方法中最快的。删除索引不会提高中等大小数据帧的速度

【讨论】:

好的,非常感谢!所以我已经实现了最快的一个^^

以上是关于过滤熊猫数据框中值的最快方法的主要内容,如果未能解决你的问题,请参考以下文章

按天过滤熊猫数据框

按列表过滤熊猫数据框

按时间戳列过滤/选择熊猫数据帧的行

如何按字符串过滤熊猫数据框?

根据日期列熊猫过滤数据框

熊猫:考虑多种条件正确过滤数据框列