我有以下数据框,我想将底部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)
为什么.loc解决方案更慢?我理解使用.loc解决方案更安全,但如果我想将数据分配给列中的所有索引,直接赋值会出现什么问题?
答案 0 :(得分:1)
.loc
沿着整个轴在你的df中搜索整个索引和列(在这种情况下,只有1列),这是耗时的,也许是多余的,除了弄清楚分位数的分位数df_temp['A']
(就计算时间而言可忽略不计)。另一方面,您的直接分配方法只是解析df_temp['A'].quantile(0.01)
,并分配df_temp['q']
。它不需要穷举搜索你的df的索引/列。
有关.loc
方法的类似说明,请参阅this answer。
就安全性而言,您没有使用链式索引,因此您可能很安全(您不是要在数据的副本上设置任何内容,而是直接设置关于数据本身)。很好地了解不使用.loc
的潜在问题(请参阅this post了解SettingWithCopy
警告的详细概述),但我认为你可以做到这一点
如果您希望更多明确关于列创建,您可以执行df = df.assign(q=df_temp["A"].quantile(0.01))
行。它不会真正改变性能(我不认为),也不会改变结果,但它允许您看到您明确地为现有数据帧分配了一个新列(因此没有在所述数据帧的副本上设置任何内容) )。