【发布时间】:2018-11-17 13:18:10
【问题描述】:
我正在使用 pandas 矢量化的 str.split() 方法来提取从“~”上的拆分返回的第一个元素。我还尝试使用带有 lambda 和 str.split() 的 df.apply() 来产生等效的结果。使用 %timeit 时,我发现 df.apply() 的执行速度比矢量化版本快。
我所读到的关于矢量化的所有内容似乎都表明第一个版本应该有更好的性能。有人可以解释为什么我会得到这些结果吗?示例:
id facility
0 3466 abc~24353
1 4853 facility1~3.4.5.6
2 4582 53434_Facility~34432~cde
3 9972 facility2~FACILITY2~343
4 2356 Test~23 ~FAC1
上面的数据框有大约 500,000 行,我也测试了大约 100 万行,结果相似。这是一些示例输入和输出:
矢量化
In [1]: %timeit df['facility'] = df['facility'].str.split('~').str[0]
1.1 s ± 54.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
Lambda 应用
In [2]: %timeit df['facility'] = df['facility'].astype(str).apply(lambda facility: facility.split('~')[0])
650 ms ± 52.1 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
有人知道我为什么会出现这种行为吗?
谢谢!
【问题讨论】:
-
为什么你认为
str.split是矢量化的? Pandas / Numpy 的矢量化通常意味着连续的内存块。df['facility']是object类型,只是一堆指针。 -
我还以为是因为这个网站:jakevdp.github.io/PythonDataScienceHandbook/…
-
我认为网站对“矢量化”一词非常慷慨。
-
我试图改进这个 lambda 函数的原因是因为我遇到了以前的 lambda,它使用 groupby 和 filter 来过滤条件下的行。当我更改此设置以使用布尔索引删除这些行时,我看到了重大的性能改进。
标签: python string pandas split vectorization