我正在探索scikit学习管道.我还想用管道预处理数据.但是,我的列车和测试数据具有不同级别的分类变量.示例:考虑:
import pandas as pd
train = pd.Series(list('abbaa'))
test = pd.Series(list('abcd'))
Run Code Online (Sandbox Code Playgroud)
我用pandas写了一个TransformerMixinClass
class CreateDummies(TransformerMixin):
def transform(self, X, **transformparams):
return pd.get_dummies(X).copy()
def fit(self, X, y=None, **fitparams):
return self
Run Code Online (Sandbox Code Playgroud)
fit_transform产生列车数据2列和测试数据4列.所以这并不奇怪,但不适合管道
同样,我试图导入标签编码器(和OneHotEncoder用于潜在的后续步骤):
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
le = LabelEncoder()
le.fit_transform(train)
le.transform(test)
Run Code Online (Sandbox Code Playgroud)
这并不奇怪,这会产生错误.
所以这里的问题是我需要测试集中包含的一些信息.有没有一种好方法将其包含在管道中?
我厌倦了将专栏更改为catgeory使用http://pandas.pydata.org/pandas-docs/stable/categorical.html中的文档
df = pd.DataFrame({'A':[1,2,3,4,5], 'B':['a','b','c','d','e'], 'C':['A','B','A','B','A']})
df['C']=df['C'].astype('category')
Run Code Online (Sandbox Code Playgroud)
如果我尝试通过类别
df['C']=df['C'].astype('category',categories=['A','B'])
Run Code Online (Sandbox Code Playgroud)
说错了
TypeError: _astype() got an unexpected keyword argument 'categories'
Run Code Online (Sandbox Code Playgroud)
什么是将类别传递给的正确方法astype()?
我有以下 df
list_columns = ['A', 'B', 'C']
list_data = [
[1, '2', 3],
[4, '4', 5],
[1, '2', 3],
[4, '4', 6]
]
df = pd.DataFrame(columns=list_columns, data=list_data)
Run Code Online (Sandbox Code Playgroud)
我想检查是否存在多个列,如果不创建它们。
示例:如果 B、C、D 不存在,则创建它们(对于上述 df 它将仅创建 D 列)我知道如何使用一列执行此操作:
if 'D' not in df:
df['D']=0
Run Code Online (Sandbox Code Playgroud)
有没有办法测试我的所有列是否都存在,如果不存在,则创建缺少的列?并且不要为每一列做一个 if
假设我有一个 pandas 专栏,如下所示
类型
类型1
类型2
类型3
现在我将采用以下虚拟模型:
type_dummies = pd.get_dummies(["Type"], prefix="type")
然后将其与主 DataFrame 连接后,生成的 df 将如下所示:
df.drop(['Type'], axis=1, inplace=True)
df = df.join(type_dummies)
df.head()
type_type1 type_type2 type_type3
1 0 0
0 1 0
0 0 1
Run Code Online (Sandbox Code Playgroud)
但是,如果我的训练集中有另一个类别(如列type4中所示)怎么办?Type那么我将如何使用get_dummies()方法来生成我想要的虚拟对象。也就是说,在这种情况下我想生成 4 个虚拟变量,尽管所需列中只有 3 个类别?