python - Pandas 根据dtype选择列

标签 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)

它工作正常。 我正在使用 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/

相关文章:

python - 使用QWebElement解析HTML,如何提取图像?

c++ - 什么是 OSX 上 C++/Python 的良好初学者设置?

python - 如何向矢量化数据集添加特征?

python - Pandas 计数正/负/中性值

machine-learning - 管道中 CountVectorizer 的 Sklearn NotFittedError

python - 如何从与 scikit-learn 中的 predict_proba 一起使用的 cross_val_predict 获取类标签

python - 选择具有共享元素的集合的算法

python - Unix上的Python,判断我是不是在用我的电脑?还是闲置?

python - 根据另一列的部分名称对 df 列中的值求和

python - 读取进程并与 dask 并行连接 pandas 数据帧