2017-08-04 99 views
0

的基础上,选择列我有一个熊猫数据帧DF具有很多列,我只想要处理的对象数据类型的列,我曾试图大熊猫D型

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

那么,您的问题是什么?添加更多细节,如果可能的话还有更多代码 –

+0

我已更新我的问题。 –

回答

1

我觉得它更容易/更清晰,以建立一个自定义变压器。此外,它可以很容易地在管道中应用

它看起来是这样的:

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 

关于在管道中使用:

你应确保训练和测试集中的列具有相同的dtype。取决于你如何预处理数据,可能是例如在训练集中,一列是浮点类型(包括一个nan),而在测试集中它是int类型(无nan),反之亦然。在这种情况下,您需要调整适配功能,以便在安装过程中固定柱子,并进一步考虑确保管道的以下步骤中的一致性dtype

+0

很好的解决问题的方法。我真的很感激。谢谢 –

+0

我更正了转换函数。它应该只包含'X'而不是'df'! – Quickbeam2k1

+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]