【问题标题】:How to use function for strings using Dask?如何使用 Dask 对字符串使用函数?
【发布时间】:2020-10-20 00:03:26
【问题描述】:

我有一个大数据集,最近被介绍给 Dask。我正在尝试标记每一行中的文本。 这在熊猫中很容易做到,如下所示,但我有一个错误提示

AttributeError: 'DataFrame' object has no attribute 'lower' 当我尝试使用 Dask 时(见下面的第二组代码)

import pandas as pd
import dask 
import dask.dataframe as dd

 def to_lower(text):
        return text.lower()

df_2016 = pd.read_csv("2016_Cleaned_DroppedDup.csv")
df_2016['token2'] = df_2016['token2'].apply(lambda x: pr.to_lower(x))

使用 DASK:

df_2016 = dd.from_pandas(df_2016, npartitions = 4 * multiprocessing.cpu_count())
df_2016 = df.2016.map_partitions.(lambda df: df.apply(lambda x: pr.to_lower(x))).compute(scheduler = 'processes')

【问题讨论】:

    标签: pandas nltk dask dask-dataframe


    【解决方案1】:

    我建议将来提供创建数据框的代码,这样就没有人需要猜测您的数据实际上是什么样子了。但我认为这个案子很简单。另外,我认为您提供的代码中存在语法错误,例如,df.2016.map_partitions 应该是df_2016.map_partitions。此外,还不清楚您的代码中的 pr 对象是什么。

    鉴于这些错误,我只是在与您的设置类似的最小工作示例中重写了使用.str 方法对dask 和pandas 中的字符串进行操作的操作。为此,pandas 和 dask 在语法上几乎没有区别。

    编辑:添加了一个用户提供的函数 (to_lower) 来举例说明在 dask 中使用 .apply

    import pandas as pd
    import dask.dataframe as dd
    
    def to_lower(text):
        return text.lower()
    
    # using pandas
    df_2016 = pd.DataFrame({'token2':['HI']*100 + ['YOU']*100})
    df_2016['token2_low'] = df_2016['token2'].str.lower()
    df_2016['token2_low_apply'] = df_2016['token2'].apply(to_lower)
    df_2016
    
        token2 token2_low token2_low_apply
    0       HI         hi               hi
    1       HI         hi               hi
    2       HI         hi               hi
    3       HI         hi               hi
    4       HI         hi               hi
    ..     ...        ...              ...
    195    YOU        you              you
    196    YOU        you              you
    197    YOU        you              you
    198    YOU        you              you
    199    YOU        you              you
    
    [200 rows x 3 columns]
    
    # using dask
    ddf_2016 = dd.from_pandas(df_2016[['token2']], npartitions=10)
    ddf_2016['token2_low'] = ddf_2016['token2'].str.lower()
    ddf_2016['token2_low_apply'] = ddf_2016['token2'].apply(to_lower, meta=('token2', 'object'))
    
    ddf_2016.compute()
    
        token2 token2_low token2_low_apply
    0       HI         hi               hi
    1       HI         hi               hi
    2       HI         hi               hi
    3       HI         hi               hi
    4       HI         hi               hi
    ..     ...        ...              ...
    195    YOU        you              you
    196    YOU        you              you
    197    YOU        you              you
    198    YOU        you              you
    199    YOU        you              you
    
    [200 rows x 3 columns]
    

    【讨论】:

    • 您好,非常感谢您,对于这个令人困惑的问题,我们深表歉意。但是您能否提供一个示例,其中 def 函数已通过 lambda apply 用于 dask 数据帧?
    • 当然。语法与 pandas 非常相似,除了 dask 在使用 apply 时会要求输出类型,因此它不必根据小子样本进行猜测。这就是 meta 参数的原因。
    猜你喜欢
    • 2012-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-11
    相关资源
    最近更新 更多