假设我有一个包含字符串的数据框data,我想将其转换为指标,我使用pandas.get_dummies(data)将其转换为一个数据集,现在我可以使用它来构建模型。现在我有了一个新的观察,我想在我的模型中运行。显然我不能使用pandas.get_dummies(new_data),因为它没有包含所有的类,也不会产生相同的指标矩阵。有什么好的方法可以做到这一点吗?
data
pandas.get_dummies(data)
pandas.get_dummies(new_data)
o4hqfura1#
看起来你可以利用category类型的优势。
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
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
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)
3条答案
按热度按时间o4hqfura1#
看起来你可以利用
category
类型的优势。训练数据:
检测数据:
功能的新值:
g6ll5ycj2#
您可以从单个新观测创建虚拟值,然后使用原始指标矩阵中的列重新索引此帧列:
退货:
ghhaqwfi3#
获取JAB的答案,以便在sklearn管道中使用它,此代码可能会帮助您: