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

时间:2015-04-12 05:35:05

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

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

from sklearn import preprocessing 
X_imputed=preprocessing.Imputer().fit_transform(X_train) 
X_imputed

新数据是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.        ]])

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

5 个答案:

答案 0 :(得分:29)

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

X_imputed_df = pd.DataFrame(X_imputed, columns = X_train.columns)

答案 1 :(得分:2)

根据Ami Tavory's回复here,根据文档,Imputer省略空列或行(但是您运行它)。
因此,在运行Imputer并按照above所述设置列名之前,运行类似这样的内容(对于列):

X_train=X_train.dropna(axis=1, how='all')

df.dropna described here.

答案 2 :(得分:1)

以上答案仍不能解决主要问题。这里有两个隐含的假设

  1. 将保留数据集的所有特征,这可能不正确。例如。某种功能选择功能。
  2. 所有特征将以相同的顺序保留,再次在某些特征选择转换中可能会隐式排序。

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

您可以在此处检查该功能的基础知识以及如何使用它... Find get_support() function description here

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

答案 3 :(得分:0)

改编自Kaggle的部分中间机器学习课程:

from sklearn.impute import SimpleImputer

# Imputation
my_imputer = SimpleImputer()
imputed_X = pd.DataFrame(my_imputer.fit_transform(X))

# Imputation removed column names; put them back
imputed_X.columns = X.columns

答案 4 :(得分:0)

scikit-learn 有一个 get_feature_names() 方法。这个想法是从here借来的。

from sklearn import preprocessing as pp

poly = pp.PolynomialFeatures(3, interaction_only=False, include_bias=False)

poly.fit(X_train)

X_test_new=pd.DataFrame(poly.transform(X_test), columns=poly.get_feature_names(X_test.columns))
X_test_new.head()