我有一个包含许多列的 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)
它工作正常。 我正在使用 Function transformer 获取 sklearn Pipline 中的数据以进行机器学习。
最佳答案
我认为构建自定义转换器更容易/更清晰。此外,它可以很容易地应用于管道
它可能看起来像这样:
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
关于管道中的使用:
您应该确保训练和测试集中的列具有相同的数据类型。根据您预处理数据的方式,它可能是例如在训练集中,列的类型为 float(包括 nan),而在测试集中,列的类型为 int(无 nan),反之亦然。在这种情况下,您需要调整拟合函数,该函数应在拟合过程中固定列,并进一步考虑确保在管道的以下步骤中保持一致的 dtype
关于python - Pandas 根据dtype选择列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45499917/