我有一个从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中,并且同时具有适合于回归变量的整数编码?怎么样?
答案 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
为代价(这应该很快)