Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在数据帧列中整数编码后将数据类型保留为类别_Python_Pandas - Fatal编程技术网

Python 在数据帧列中整数编码后将数据类型保留为类别

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

我有一个从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 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个新列添加到数据框架中。这正是我想要避免的。请看我建议的第二种方法。一种形式的访问器应该对您有所帮助。我喜欢第二种方法,并回答了我最初的问题。