pandas根据dtype选择列

时间:2017-08-04 06:47:01

标签: python pandas scikit-learn sklearn-pandas

我有一个包含许多列的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中的数据以进行机器学习。

2 个答案:

答案 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

相关问题