将“pandas.get_dummies”转换到新数据的简单方法?

Posted

技术标签:

【中文标题】将“pandas.get_dummies”转换到新数据的简单方法?【英文标题】:Easy way to apply transformation from `pandas.get_dummies` to new data? 【发布时间】:2015-04-12 11:45:36 【问题描述】:

假设我有一个数据框data,其中包含我想转换为指标的字符串。我使用pandas.get_dummies(data) 将其转换为我现在可以用于构建模型的数据集。

现在我有一个新的观察结果,我想在我的模型中运行。显然我不能使用pandas.get_dummies(new_data),因为它不包含所有的类并且不会制作相同的指标矩阵。有什么好办法吗?

【问题讨论】:

【参考方案1】:

提取 JAB 的答案以便在 sklearn 管道中使用它,此代码可能会对您有所帮助:

from sklearn.base import BaseEstimator, TransformerMixin

class GetDummies(BaseEstimator, TransformerMixin):
    def __init__(self, dummy_columns):
        self.columns = None
        self.dummy_columns = dummy_columns

    def fit(self, X, y=None):
        self.columns = pd.get_dummies(X, columns=self.dummy_columns).columns
        return self

    def transform(self, X):
        X_new = pd.get_dummies(X, columns=self.dummy_columns)
        return X_new.reindex(columns=self.columns, fill_value=0)

【讨论】:

【参考方案2】:

您可以从单个新观察中创建虚拟对象,然后使用原始指标矩阵中的列重新索引此框架列:

import pandas as pd
df = pd.DataFrame('cat':['a','b','c','d'],'val':[1,2,5,10])
df1 = pd.get_dummies(pd.DataFrame('cat':['a'],'val':[1]))
dummies_frame = pd.get_dummies(df)
df1.reindex(columns = dummies_frame.columns, fill_value=0)

返回:

        val     cat_a   cat_b   cat_c   cat_d
  0     1       1       0       0       0

【讨论】:

您可能希望 fill_value=0。 上帝,我喜欢堆栈溢出。 这意味着在推理时将整个训练数据帧保存在内存中!? @marbel 不,您只需要列索引。 如果测试数据不包含该类别的未见值,则此方法有效。但如果真的发生了怎么办?正确的解决方案是将其归为“其他”类别。如何有效地实现这一点?

以上是关于将“pandas.get_dummies”转换到新数据的简单方法?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 pandas get_dummies 函数应用于有效数据集?

特征提取pd.get_dummies() 详解(One-Hot Encoding)

Pandas.get_dummies 返回两列(_Y 和 _N)而不是一列

将 pandas 稀疏数据帧转换为稀疏 numpy 矩阵以供 sklearn 使用?

pandas.get_dummies

Pandas.get_dummies返回两列(_Y和_N)而不是一列