我有一个从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中保留类别编码信息,同时具有适合回归量的整数编码?怎么样?
1.简单的想法
为什么不在回归拟合中使用派生列,例如:
df_raw[col + '_calculated'] = df_raw[col].cat.codes
通过这种方式,你有两个:一个不改变这个特征的分类列col
和一个带有int
s的“计算”列,以便进一步处理?
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
(这应该相当快)。