Pandas学习一个热编码数据帧还是numpy?

2024-09-28 20:49:51 发布

您现在位置:Python中文网/ 问答频道 /正文

如何将pandas数据帧转换为sklearn一个热编码(dataframe/numpy数组),其中有些列不需要编码?在

mydf = pd.DataFrame({'Target':[0,1,0,0,1, 1,1],
                   'GroupFoo':[1,1,2,2,3,1,2],
                    'GroupBar':[2,1,1,0,3,1,2],
                    'GroupBar2':[2,1,1,0,3,1,2],
                    'SomeOtherShouldBeUnaffected':[2,1,1,0,3,1,2]})
columnsToEncode = ['GroupFoo', 'GroupBar']

是一个已经被标签编码的数据帧,我只想对columnsToEncode标记的列进行编码?在

我的问题是我不确定pd.Dataframenumpy数组表示是否更好,以及如何将编码部分与另一部分重新合并。在

我目前的尝试:

^{pr2}$

注意:我知道Pandas: Get Dummies/http://pandas.pydata.org/pandas-docs/stable/generated/pandas.get_dummies.html,但这在我要求每次进行这样的编码的训练/测试分割中不起作用。在


Tags: 数据numpytargetdataframepandas编码数组sklearn
2条回答

这个库提供了几个分类编码器,使sklearn/numpy可以很好地与pandashttps://github.com/wdm0006/categorical_encoding配合使用

但是,它们还不支持“处理未知类别”

现在我要用

myEncoder = OneHotEncoder(sparse=False, handle_unknown='ignore')
myEncoder.fit(df[columnsToEncode])

pd.concat([df.drop(columnsToEncode, 1),
          pd.DataFrame(myEncoder.transform(df[columnsToEncode]))], axis=1).reindex()

因为它支持未知的数据集。现在,我会坚持一半熊猫一半纽比,因为熊猫标签不错。对于数字列。在

我相信,为了执行虚拟编码,对初始答案的更新甚至更好 导入日志记录

import pandas as pd
from sklearn.base import TransformerMixin

log = logging.getLogger(__name__)


class CategoricalDummyCoder(TransformerMixin):
    """Identifies categorical columns by dtype of object and dummy codes them. Optionally a pandas.DataFrame
    can be returned where categories are of pandas.Category dtype and not binarized for better coding strategies
    than dummy coding."""

    def __init__(self, only_categoricals=False):
        self.categorical_variables = []
        self.categories_per_column = {}
        self.only_categoricals = only_categoricals

    def fit(self, X, y):
        self.categorical_variables = list(X.select_dtypes(include=['object']).columns)
        logging.debug(f'identified the following categorical variables: {self.categorical_variables}')

        for col in self.categorical_variables:
            self.categories_per_column[col] = X[col].astype('category').cat.categories
        logging.debug('fitted categories')
        return self

    def transform(self, X):
        for col in self.categorical_variables:
            logging.debug(f'transforming cat col: {col}')
            X[col] = pd.Categorical(X[col], categories=self.categories_per_column[col])
            if self.only_categoricals:
                X[col] = X[col].cat.codes
        if not self.only_categoricals:
            return pd.get_dummies(X, sparse=True)
        else:
            return X

相关问题 更多 >