在Pandas DataFrame列中进行整数编码后,将dtype保留为类别

时间:2019-02-15 20:56:33

标签: python pandas

我有一个从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访问器与“类别” dtype一起使用

从某种意义上讲,因为它的dtype是int8

是否可以将类别编码信息保留在同一DataFrame中,并且同时具有适合于回归变量的整数编码?怎么样?

1 个答案:

答案 0 :(得分:1)

1。简单的想法

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

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

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

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为代价(这应该很快)