代码之家  ›  专栏  ›  技术社区  ›  jarry jafery

熊猫根据数据类型选择列

  •  1
  • jarry jafery  · 技术社区  · 7 年前

    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)
    

    2 回复  |  直到 7 年前
        1
  •  2
  •   Quickbeam2k1    7 年前

    我认为构建自定义转换器更容易/更清晰。此外,它可以很容易地应用于管道中

    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
    

    关于管道中的使用:

    您应该确保训练集和测试集中的列具有相同的数据类型。根据预处理数据的方式,例如在训练集中,列的类型可能是浮点型(包括nan),而在测试集中,列的类型可能是int型(无nan),反之亦然。在这种情况下,您需要调整fit函数,该函数在拟合期间固定列,并进一步考虑在管道的以下步骤中确保数据类型一致

        2
  •  2
  •   Clock Slave    7 年前

    你可以用这样的

    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]