pandas 将'panda.get_dummies'转换为新数据的简单方法?

uyhoqukh  于 2023-03-11  发布在  其他
关注(0)|答案(3)|浏览(117)

假设我有一个包含字符串的数据框data,我想将其转换为指标,我使用pandas.get_dummies(data)将其转换为一个数据集,现在我可以使用它来构建模型。
现在我有了一个新的观察,我想在我的模型中运行。显然我不能使用pandas.get_dummies(new_data),因为它没有包含所有的类,也不会产生相同的指标矩阵。有什么好的方法可以做到这一点吗?

o4hqfura

o4hqfura1#

看起来你可以利用category类型的优势。

import pandas as pd

train = pd.DataFrame({'feature':['a', 'b', 'c', 'd']})
test = pd.DataFrame({'feature':['a']})

train['feature'] = train['feature'].astype('category')
dummies_type = train['feature'].dtype
test['feature'] = test['feature'].astype(dummies_type)

训练数据:

pd.get_dummies(train)

feature_a   feature_b   feature_c   feature_d
1   0   0   0
0   1   0   0
0   0   1   0
0   0   0   1

检测数据:

pd.get_dummies(test)

feature_a   feature_b   feature_c   feature_d
1   0   0   0

功能的新值:

test_oov = pd.DataFrame({'feature':['z']})
test_oov['feature'] = test_oov['feature'].astype(dummies_type)
pd.get_dummies(test_oov)

feature_a   feature_b   feature_c   feature_d
0   0   0   0
g6ll5ycj

g6ll5ycj2#

您可以从单个新观测创建虚拟值,然后使用原始指标矩阵中的列重新索引此帧列:

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
ghhaqwfi

ghhaqwfi3#

获取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)

相关问题