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

问题描述 投票:3回答:1

我有一个从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,我将得到错误:

只能使用带有'category'dtype`的.cat访问器

这在某种程度上是完全合理的,因为它的类型是int8

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

python pandas
1个回答
1
投票

1.简单的想法

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

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

通过这种方式,你有两个:一个不改变这个特征的分类列col和一个带有ints的“计算”列,以便进一步处理?

2.更聪明的方法

另一种方法可能是在将数据帧传递给fit方法之前将其包装起来,使regressor直接访问.cat.codes而不是分类值:

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

fit(..., access_wrapper(df, col))

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

© www.soinside.com 2019 - 2024. All rights reserved.