【问题标题】:How to speed up pandas string function?如何加快熊猫字符串功能?
【发布时间】: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


【解决方案1】:

Pandas 字符串方法只是“矢量化”的,因为您不必自己编写循环。实际上并没有进行任何并行化,因为字符串(尤其是正则表达式问题)本质上很难(不可能?)并行化。如果你真的想要速度,你实际上应该在这里退回到 python。

%timeit df['facility'].str.split('~', n=1).str[0]
%timeit [x.split('~', 1)[0] for x in df['facility'].tolist()]

411 ms ± 10.2 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
132 ms ± 302 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

有关循环何时比 pandas 函数更快的更多信息,请查看For loops with pandas - When should I care?

至于为什么apply 更快,我相信apply 正在应用的函数(即str.split)比Series.str.split 内部发生的字符串拆分要轻得多.

【讨论】:

  • 谢谢你,coldspeed。我确实尝试过使用类似的方法: pd.DataFrame([ x.split('~')[0] for x in list(df['facility'].astype(str) 并看到与使用 apply 的性能大致相同。你的代码看起来更干净,我会测试一下。
猜你喜欢
  • 1970-01-01
  • 2015-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-30
  • 1970-01-01
  • 2020-02-22
  • 2021-10-17
相关资源
最近更新 更多