在 Pandas 中使用 .loc 会减慢计算速度

use*_*642 5 python pandas

我有以下数据框,我想将底部 1% 的值分配给新列。当我使用“.loc”通知进行此计算时,使用 .loc 分配大约需要 10 秒,而替代解决方案仅需要 2 秒。

df_temp = pd.DataFrame(np.random.randn(100000000,1),columns=list('A'))
%time df_temp["q"] = df_temp["A"].quantile(0.01)
%time df_temp.loc[:, "q1_loc"] = df_temp["A"].quantile(0.01)
Run Code Online (Sandbox Code Playgroud)

为什么 .loc 解决方案更慢?我知道使用 .loc 解决方案更安全,但如果我想将数据分配给列中的所有索引,直接分配会出现什么问题?

sac*_*cuL 3

.loc正在沿着整个轴搜索 df 中的整个索引和列(在本例中,只有 1 列),这非常耗时,而且可能是多余的,此外还要计算出 的分位数df_temp['A'](就计算而言可以忽略不计)时间)。另一方面,您的直接赋值方法只是解析df_temp['A'].quantile(0.01)和赋值df_temp['q']。它不需要详尽地搜索 df 的索引/列。

有关该方法的类似描述,请参阅此答案.loc

就安全性而言,您没有使用链式索引,因此您可能是安全的(您不会尝试在数据副本上设置任何内容,而是直接在数据本身上设置)。最好了解不使用的潜在问题.loc(请参阅这篇文章以获取有关警告的详细概述SettingWithCopy),但我认为就目前情况而言,您没有问题。

如果您想明确地了解列的创建,您可以按照df = df.assign(q=df_temp["A"].quantile(0.01)). 它不会真正改变性能(我不认为),也不会改变结果,但它允许您看到您显式地将新列分配给现有数据帧(因此不会在所述数据帧的副本上设置任何内容) )。