【问题标题】:Is it possible to use Series.str.extract with Dask?是否可以将 Series.str.extract 与 Dask 一起使用?
【发布时间】:2020-12-07 15:41:09
【问题描述】:

我目前正在使用 Pandas 处理一个大型数据集,我必须使用 pandas.Series.str.extract 提取一些数据。 它看起来像这样:

df['output_col'] = df['input_col'].str.extract(r'.*"mytag": "(.*?)"', expand=False).str.upper()

但是,它运行良好,因为它必须执行大约十次(使用各种源列),性能不是很好。为了通过使用多个内核来提高性能,我想尝试 Dask,但它似乎不受支持(我在 dask 的文档中找不到对提取方法的任何引用)。

有没有办法并行执行这样的 Pandas 动作? 我找到了this method,你基本上将你的数据帧分成多个,为每个子帧创建一个进程,然后将它们连接回来。

【问题讨论】:

    标签: pandas dask dask-dataframe


    【解决方案1】:

    最好的办法是使用map_partitions,它使您能够对系列的各个部分执行一般的 pandas 操作,并且就像您链接的多处理方法的托管版本一样。

    def inner(df):
        df['output_col'] = df['input_col'].str.extract(
            r'.*"mytag": "(.*?)"', expand=False).str.upper()
        return df
    
    out = df.map_partitions(inner)
    

    由于这是一个字符串操作,您可能需要进程(例如分布式调度程序)而不是线程。请注意,如果您使用 dask(例如 dd.read_csv)加载数据而不是在内存中创建数据帧然后将其传递给 dask,您的性能会好得多。

    【讨论】:

      【解决方案2】:

      您应该能够像在 pandas 中一样执行此操作。它在文档的this 部分中提到,但扩展它可能很有价值。

      import pandas as pd
      import dask.dataframe as dd
      ​
      s = pd.Series(["example", "strings", "are useful"])
      ds = dd.from_pandas(s, 2)
      ds.str.extract("[a-z\s]{4}(.{2})", expand=False).str.upper().compute()
      0    PL
      1    NG
      2    US
      dtype: object
      

      【讨论】:

      • 好的,我已经尝试了一个代码示例,它似乎可以工作。
      猜你喜欢
      • 1970-01-01
      • 2021-11-12
      • 2016-04-01
      • 2011-01-20
      • 2018-08-11
      • 2021-08-05
      • 2019-03-18
      • 2014-03-15
      • 2021-03-31
      相关资源
      最近更新 更多