如何在scikit-learn中预处理后保留数据框的列标题

Bak*_*war 33 python numpy pandas scikit-learn

我有一个pandas数据框,有一些行和列.每列都有一个标题.现在,只要我继续在pandas中进行数据操作操作,我的变量头就会被保留.但是如果我尝试使用Sci-kit-learn lib的一些数据预处理功能,我最终会丢失所有标题,并且帧会转换为数字矩阵.

我理解为什么会发生这种情况,因为scikit-learn给出了一个numpy ndarray作为输出.而numpy ndarray只是矩阵不会有列名.

但事情就是这样.如果我在我的数据集上构建一些模型,即使在初始数据预处理和尝试某些模型之后,我可能还需要做一些更多的数据操作任务来运行其他模型以获得更好的拟合.无法访问列标题使得很难进行数据操作,因为我可能不知道特定变量的索引是什么,但是更容易记住变量名,甚至可以通过执行df.columns来查找.

如何克服这个?

EDIT1:使用示例数据快照进行编辑.

    Pclass  Sex Age SibSp   Parch   Fare    Embarked
0   3   0   22  1   0   7.2500  1
1   1   1   38  1   0   71.2833 2
2   3   1   26  0   0   7.9250  1
3   1   1   35  1   0   53.1000 1
4   3   0   35  0   0   8.0500  1
5   3   0   NaN 0   0   8.4583  3
6   1   0   54  0   0   51.8625 1
7   3   0   2   3   1   21.0750 1
8   3   1   27  0   2   11.1333 1
9   2   1   14  1   0   30.0708 2
10  3   1   4   1   1   16.7000 1
11  1   1   58  0   0   26.5500 1
12  3   0   20  0   0   8.0500  1
13  3   0   39  1   5   31.2750 1
14  3   1   14  0   0   7.8542  1
15  2   1   55  0   0   16.0000 1
Run Code Online (Sandbox Code Playgroud)

以上基本上是熊猫数据帧.现在当我在这个数据框上执行此操作时,它将剥离列标题.

from sklearn import preprocessing 
X_imputed=preprocessing.Imputer().fit_transform(X_train) 
X_imputed
Run Code Online (Sandbox Code Playgroud)

新数据是numpy数组,因此列名被剥离.

array([[  3.        ,   0.        ,  22.        , ...,   0.        ,
          7.25      ,   1.        ],
       [  1.        ,   1.        ,  38.        , ...,   0.        ,
         71.2833    ,   2.        ],
       [  3.        ,   1.        ,  26.        , ...,   0.        ,
          7.925     ,   1.        ],
       ..., 
       [  3.        ,   1.        ,  29.69911765, ...,   2.        ,
         23.45      ,   1.        ],
       [  1.        ,   0.        ,  26.        , ...,   0.        ,
         30.        ,   2.        ],
       [  3.        ,   0.        ,  32.        , ...,   0.        ,
          7.75      ,   3.        ]])
Run Code Online (Sandbox Code Playgroud)

所以我想在我的pandas数据框上进行一些数据操作时保留列名.

sel*_*yth 35

在大多数情况下,scikit-learn确实会删除列标题,因此请稍后重新添加它们.在您的示例中,X_imputed作为sklearn.preprocessing输出和X_train原始数据框,您可以将列标题重新打开:

X_imputed_df = pd.DataFrame(X_imputed, columns = X_train.columns)
Run Code Online (Sandbox Code Playgroud)

  • 如果我的预处理步骤是功能选择?比方说,我有1000列并且经过预处理(sklearn.feature_selection.SelectPercentile)它只返回100列.我如何知道删除的列和未删除的列 (16认同)
  • 使用[get_support方法](http://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.SelectPercentile.html#sklearn.feature_selection.SelectPercentile.get_support).`X_selected_df = pd.DataFrame(X_selected,columns = [X_train.columns [i] for i in range(len(X_train.columns))if feature_selector.get_support()[i]])` (4认同)
  • 您还可以添加索引。`pd.DataFrame(数据=transformed_data),列=train_data.columns,索引=train_data.index` (2认同)

小智 7

上面的回答仍然没有解决主要问题。这里有两个隐含的假设

  1. 数据集的所有特征都将被保留,但这可能不是真的。例如某种特征选择功能。
  2. 所有特征都将以相同的顺序保留,同样在某些特征选择转换中可能存在隐式排序。

至少在一些拟合和变换函数中有一个“get_support()”方法,用于保存有关保留哪些列(特征)以及保留顺序的信息。

您可以在此处查看该函数的基础知识以及如何使用它... 在此处查找 get_support() 函数描述

这将是获取此处所需信息的最首选和官方方式。


ACh*_*ony 5

根据Ami Tavory 的回复,根据文档,Imputer 会忽略空列或空行(无论您如何运行它)。
因此,在运行 Imputer 并按上述方式设置列名称之前请运行如下命令(对于列):

X_train=X_train.dropna(axis=1, how='all')
Run Code Online (Sandbox Code Playgroud)

df.dropna 在此描述。