pandas 当使用布尔掩码索引DataFrame时,按顺序应用掩码是否更快?

5jdjgkvh  于 2022-12-16  发布在  其他
关注(0)|答案(1)|浏览(150)

给定一个大的DataFrame df,一般来说哪个更快?

# combining the masks first
sub_df = df[(df["column1"] < 5) & (df["column2"] > 10)]
# applying the masks sequentially
sub_df = df[df["column1"] < 5]
sub_df = sub_df[sub_df["column2"] > 10]

第一种方法仅从DataFrame中选择一次,这可能更快,然而,第二个示例中的第二种选择只需考虑较小的DataFrame。

s5a0g9ez

s5a0g9ez1#

这取决于您的数据集。
首先,让我们生成一个DataFrame,其中包含在第一个条件中应该删除的几乎所有值:

n = 1_000_000
p = 0.0001
np.random.seed(0)
df = pd.DataFrame({'column1': np.random.choice([0,6], size=n, p=[p, 1-p]),
                   'column2': np.random.choice([0,20], size=n)})

正如所料:

# simultaneous conditions
5.69 ms ± 300 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

# successive slicing
2.99 ms ± 45.7 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

首先生成一个小的中间体会更快。
现在,我们将概率改为p = 0.9999,这意味着第一个条件将删除很少的行。
我们可以预期两种解决方案的运行速度相似,但是:

# simultaneous conditions
27.5 ms ± 2.33 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

# successive slicing
55.7 ms ± 3.44 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

现在,创建中间DataFrame的开销不可忽略。

相关问题