Python 在数据帧列中整数编码后将数据类型保留为类别
我有一个从csv读取的Pandas数据帧,它有一些带有字符串值的列,但实际上是Python 在数据帧列中整数编码后将数据类型保留为类别,python,pandas,Python,Pandas,我有一个从csv读取的Pandas数据帧,它有一些带有字符串值的列,但实际上是对象类型。因为它们是分类的,所以我将它们转换成类别,然后转换成整数表示,然后拟合一个随机森林回归器 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
对象
类型。因为它们是分类的,所以我将它们转换成类别
,然后转换成整数表示,然后拟合一个随机森林回归器
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”数据类型一起使用`
从某种意义上说,这是非常合理的,因为它的数据类型是int8
是否可以在同一数据帧中保留类别编码信息,同时使用整数编码以适应回归器?怎么做?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.code
(这应该相当快).请给出一个输入示例。更精确的输入确实有助于准确地解决问题。您希望(现在正确地)整数编码列成为分类数据类型,有什么原因吗?列数据类型的主要原因是pandas/numpy能够有效地处理它们…@roganjosh我更新了问题,它是否完整。@G.Anderson,只是因为我希望以后能够查找编码,而不必跟踪额外的列集或新变量。或者说,为了方便重新排序,如果我没有弄错的话,那么我实际上是按照上面的步骤添加了一个额外的列。我有大约20个分类列,这意味着有20个新列添加到数据框架中。这正是我想要避免的。请看我建议的第二种方法。一种形式的访问器应该对您有所帮助。我喜欢第二种方法,并回答了我最初的问题。