我有以下数据框,我想将底部 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 解决方案更安全,但如果我想将数据分配给列中的所有索引,直接分配会出现什么问题?
.loc
正在沿着整个轴搜索 df 中的整个索引和列(在本例中,只有 1 列),除了计算出 的分位数之外,这非常耗时,而且可能是多余的df_temp['A']
(就计算时间而言,可以忽略不计)。另一方面,您的直接赋值方法只是解析df_temp['A'].quantile(0.01)
,并分配df_temp['q']
。它不需要详尽地搜索 df 的索引/列。
See 这个答案 https://stackoverflow.com/a/27597343/6671176对于类似的描述.loc
method.
就安全性而言,您没有使用链式索引,因此您可能是安全的(您不会尝试在copy您的数据,它是直接在数据本身上设置的)。最好了解不使用的潜在问题.loc
(see 这个帖子 https://www.dataquest.io/blog/settingwithcopywarning/一个很好的概述SettingWithCopy
警告),但我认为就目前而言你还可以。
如果你想成为more明确你的列创建,你可以做一些类似的事情df = df.assign(q=df_temp["A"].quantile(0.01))
。它不会真正改变性能(我不认为),也不会改变结果,但它允许您看到您明确地将新列分配给现有数据帧(因此不会在所述数据帧的副本上设置任何内容) )。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)