将“pandas.get_dummies”的转换应用到新数据的简单方法?
Easy way to apply transformation from `pandas.get_dummies` to new data?
假设我有一个数据框 data
,其中包含要转换为指标的字符串。我使用 pandas.get_dummies(data)
将其转换为我现在可以用于构建模型的数据集。
现在我有一个新的观察结果想 运行 通过我的模型。显然我不能使用 pandas.get_dummies(new_data)
因为它不包含所有 类 并且不会生成相同的指标矩阵。有什么好的方法吗?
您可以根据单个新观察创建虚拟变量,然后使用原始指标矩阵中的列重新索引此帧列:
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)
returns:
val cat_a cat_b cat_c cat_d
0 1 1 0 0 0
提取 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)
假设我有一个数据框 data
,其中包含要转换为指标的字符串。我使用 pandas.get_dummies(data)
将其转换为我现在可以用于构建模型的数据集。
现在我有一个新的观察结果想 运行 通过我的模型。显然我不能使用 pandas.get_dummies(new_data)
因为它不包含所有 类 并且不会生成相同的指标矩阵。有什么好的方法吗?
您可以根据单个新观察创建虚拟变量,然后使用原始指标矩阵中的列重新索引此帧列:
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)
returns:
val cat_a cat_b cat_c cat_d
0 1 1 0 0 0
提取 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)