【问题标题】:pandas Selecting columns on the basis of dtypepandas 根据 dtype 选择列
【发布时间】:2018-01-11 23:39:45
【问题描述】:

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

【问题讨论】:

  • 那么你的问题是什么?添加更多细节,如果可能的话,添加更多代码。
  • 我更新了我的问题。

标签: python pandas scikit-learn sklearn-pandas


【解决方案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。根据您预处理数据的方式,它可能是例如在训练集中,一列的类型为 float(包括 nan),而在测试集中,它的类型为 int(无 nan),反之亦然。在这种情况下,您需要调整 fit 函数,该函数应在拟合期间固定列,并进一步考虑确保管道的以下步骤中的 dtype 一致

【讨论】:

  • 很好地解决了这个问题。我真的很感激。谢谢
  • 我更正了变换函数。它应该只包含X 而不是df
【解决方案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]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-02
    • 2013-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-01
    • 1970-01-01
    相关资源
    最近更新 更多