【问题标题】:Preserving dtype as category after integer encoding in Pandas DataFrame column在 Pandas DataFrame 列中进行整数编码后,将 dtype 保留为类别
【发布时间】:2019-07-10 01:07:53
【问题描述】:

我有一个从 csv 读取的 Pandas DataFrame,其中包含一些带有字符串值的列,但实际上是 object 类型。因为它们是分类的,所以我将它们转换为category,然后转换为整数表示,然后我拟合一个随机森林回归器。

for col in df_raw.select_dtypes(include='object'):
    df_raw[col] = df_raw[col].astype('category')
    df_raw[col] = df_raw[col].cat.codes #not 'category' type anymore.

问题是如果我这样做,那么dtype 会立即转换为int,我会丢失cat 信息,我稍后需要。

例如,在循环的第一行之后,我可以运行df_raw[col].cat,我会得到预期的索引类别。但是一旦执行第二行,dtype 列变为int8,就会报错:

只能将 .cat 访问器与 'category' dtype 一起使用`

这在某种程度上说得通,因为它的 dtype 是 int8

是否可以在同一个 DataFrame 中保留类别编码信息,同时使用整数编码来适应回归器?怎么样?

【问题讨论】:

  • 请举例输入
  • 更精确的MCVE 确实有助于准确地确定问题的答案。
  • 您是否有理由希望(现在正确)整数编码列成为分类 dtype?列 dtypes 的主要原因是 pandas/numpy 能够有效地处理它们......
  • @roganjosh 我已经更新了问题,它是否完整。
  • @G.Anderson,只是因为我希望以后能够查找编码,而不必跟踪一组额外的列或新变量。或者说,轻松重新排序。

标签: python pandas


【解决方案1】:

你可以使用

train.col = pd.Categorical(train.col)

让它从 int 回到分类类型

然后运行

train.col.cat.codes  

【讨论】:

    【解决方案2】:

    1.简单的想法

    为什么不在回归拟合中使用派生列,例如:

    df_raw[col + '_calculated'] = df_raw[col].cat.codes
    

    通过这种方式,您可以同时拥有:一个不会更改此功能的分类列 col 和一个带有 ints 的“计算”列,以供进一步处理?

    2。更聪明的方法

    另一种方法是在将数据帧传递给fit 方法之前包装数据帧,使回归器直接访问.cat.codes 而不是分类值:

    def access_wrapper(dframe, col):
       yield from dframe[col].cat.codes
    
    fit(..., access_wrapper(df, col))
    

    通过这种方式,您根本不会影响数据帧,也不会从 df[col] 复制值,而代价是每次访问该值时都会调用 dframe[col].cat.codes(这应该相当快)。

    【讨论】:

    • 如果我的理解正确,那么我实际上是按照上述步骤添加了一个额外的列。我有大约 20 个分类列,这意味着将 20 个新列添加到数据框中。这正是我想要避免的。
    • 请参阅我建议的第二种方法。访问器的一种形式应该对您有所帮助。而且它相当有效(尤其是在内存方面)。
    • 我喜欢第二种方法,并回答了我原来的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-17
    • 2013-05-22
    • 2022-07-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多