代码之家  ›  专栏  ›  技术社区  ›  davidvera

Dask:NotImplemented错误:不支持类别未知的`df.column.cat.codes`

  •  0
  • davidvera  · 技术社区  · 4 年前

    我使用这段代码创建了一个列,用于在数据帧中创建产品id:

    df = df.assign(id=(df['PROD_NAME']).astype('category').cat.codes)
    

    如果我使用pandas,这段代码工作得很好。此行允许我为每个PROD_NAME值创建一个id。 我的问题是,我想使用Dask,它允许我管理多个客户端并处理内存问题。

    我收到以下错误消息:

    NotImplementedError: `df.column.cat.codes` with unknown categories is not supported.  Please use `column.cat.as_known()` or `df.categorize()` beforehand to ensure known categories
    

    那么,我该如何创建这个新专栏呢?

    0 回复  |  直到 4 年前
        1
  •  2
  •   AlexK    4 年前

    这是一个旧帖子,但作为搜索此错误时出现的第一个帖子,它可能需要一个答案:

    TL;博士:

    在Dask数据帧上运行以下序列:

    ddf["PROD_NAME"] = ddf["PROD_NAME"].cat.as_known()
    ddf = ddf.assign(id=(ddf["PROD_NAME"].cat.codes))
    out_df = ddf.compute()
    

    根据Dask的 documentation ,您可以在Dask中在“已知类别”和“未知类别”之间转换分类数据类型。在这种情况下,它需要“已知”的类别,因为它需要从列元数据中提取类别映射。

    import pandas as pd
    from dask import dataframe as dd
    
    # Show the pandas workflow
    >>> d = pd.Series(['A','B','D'], dtype='category').to_frame(name=“PROD_NAME”)
    >>> d = d.assign(id=(d["PROD_NAME"]).astype('category').cat.codes)
    >>> d
       PROD_NAME  id
    0          A   0
    1          B   1
    2          D   2
    
    # Now, in Dask:
    >>> ddf = dd.from_pandas(d, npartitions=1)
    >>> ddf
    Dask DataFrame Structure:
                         PROD_NAME
    npartitions=1                 
    0              category[known]
    2                          ...
    Dask Name: from_pandas, 1 tasks
    
    # The conversion to Dask dataframe already created a "known categorical", but
    # let's convert it to "unknown" (notice the .compute() is not used):
    >>> ddf["PROD_NAME"] = ddf["PROD_NAME"].cat.as_unknown()
    >>> ddf
    Dask DataFrame Structure:
                           PROD_NAME
    npartitions=1                   
    0              category[unknown]
    2                            ...
    Dask Name: assign, 3 tasks
    
    # Now, let's convert it back to "known", then create the new column using .assign()
    # and call .compute() to create output dataframe:
    >>> ddf["PROD_NAME"] = ddf["PROD_NAME"].cat.as_known()
    >>> ddf = ddf.assign(id=(ddf["PROD_NAME"].cat.codes))
    >>> out_df = ddf.compute()
    >>> out_df
      PROD_NAME  id
    0         A   0
    1         B   1
    2         D   2