我有一个包含许多列的pandas数据帧df我只想处理我尝试过的对象数据类型的列
from sklearn.preprocessing import FunctionTransformer
get_cat=FunctionTransformer(lambda x:x if x.dtype==np.dtype(object) else None,validate=False)
get_cat.fit_transform(df)
但我收到错误
AttributeError: 'DataFrame' object has no attribute 'dtype'
但是如果我使用列名作为
执行相同的操作get_cat=FunctionTransformer(lambda x:x[[col_names]],validate=False)
工作正常。 我正在使用函数转换器来获取sklearn Pipline中的数据以进行机器学习。
答案 0 :(得分:2)
你可以使用像这样的
df_dtypes = df.dtypes.values.tolist()
select_dtype = np.dtype('int64')
select_cols = [True if x == select_dtype else False for x in df_dtypes]
答案 1 :(得分:2)
我认为构建自定义变压器更容易/更清晰。此外,它可以很容易地应用于管道
看起来像这样:
class SelectDtypeColumnsTransfomer(TransformerMixin):
def __init__(self, dtype=object):
self.dtype = dtype
def transform(self, X, **transform_params):
""" X : pandas DataFrame """
columns = X.columns[X.dtypes == self.dtype]
trans = X[columns].copy()
return trans
def fit(self, X, y=None, **fit_params):
return self
一个例子:
df = pd.DataFrame({'A':[1, 2], 'B': ['s', 'd'], 'c':['test', 'r']})
print(SelectDtypeColumnsTransfomer(np.int64).transform(df))
A
0 1
1 2
print(SelectDtypeColumnsTransfomer(object).transform(df))
B c
0 s test
1 d r
关于在管道中的使用:
您应该确保训练和测试集中的列具有相同的dtypes。根据您对数据进行预处理的方式,可能是在训练集中,列的类型为float(包括nan),而在测试集中,它的类型为int(无nan),反之亦然。在这种情况下,您需要调整拟合函数,该函数在拟合期间sholud固定列,并进一步考虑在管道的后续步骤中确保一致的dtypes