0

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

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

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

有没有办法并行执行这样的 Pandas 动作?我发现了这种方法,您基本上将数据帧拆分为多个数据帧,为每个子帧创建一个进程,然后将它们连接回来。

4

2 回答 2

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,那么您的性能会好得多。

于 2020-12-07T17:05:06.140 回答
1

你应该能够像在熊猫中那样做到这一点。部分文档中提到了它,但扩展它可能很有价值。

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
于 2020-12-07T17:40:57.977 回答