当使用 pandas 数据框时,我喜欢使用方法链,因为它使工作流程类似于 R 中的 tidyverse 方法,其中使用一串管道。
考虑一下这个答案中的例子:
N = 10
df = (
pd.DataFrame({"x": np.random.random(N)})
.assign(y=lambda d: d['x']*0.5)
.assign(z=lambda d: d.y * 2)
.assign(w=lambda d: d.z*0.5)
)
我想我听说过使用 lambda 操作数据帧效率低下,因为它不是一个矢量化操作,但是在后台进行了一些循环。
上述示例是否存在这样的问题?除了在方法链中使用 lambda 之外,还有其他方法可以保留类似 tidyverse 的方法吗?
您的操作是矢量化的,lambda 不是作为值的级别运行,而是作为列名运行。对于足够大的数据集,该函数的运行时间可以忽略不计。
但是,每次
assign
调用都会生成一个新的 DataFrame。您可以使用单个
assign
调用,这样可以避免为每个步骤生成中间体:性能有显著提升:
注意:我只是在计时
.assign(x,y,z)
,.assign(x).assign(y).assign(z)
DataFrame 是预先生成的。