当前位置: 首页 > 知识库问答 >
问题:

如何在scikit学习中保留数据帧预处理后的列标题

雍飞雨
2023-03-14

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

我理解为什么会发生这种情况,因为Scikit学习给出了一个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.        ]])

所以我想保留列名,当我做一些数据处理我的熊猫数据框架。

共有3个答案

慕凌龙
2023-03-14

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

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

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

您可以在这里查看该函数的基础知识以及如何使用它...get_support函数描述

这将是获得这里所需信息的最首选和官方方式。

慕阳文
2023-03-14

根据Ami Tavory在此处的回复,根据文档,插补器会忽略空列或空行(无论您如何运行它)。
因此,在运行插补器并如上所述设置列名之前,请运行类似以下内容(对于列):

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

这里描述了df.dropna。

章德惠
2023-03-14

scikit learn在大多数情况下确实会剥离列标题,因此只需在之后再添加它们即可。在您的示例中,使用X_imputed作为sklearn.preprocessingoutput和X_train作为原始数据帧,您可以通过以下方式重新打开列标题:

X_imputed_df = pd.DataFrame(X_imputed, columns = X_train.columns)
 类似资料:
  • 我使用Pandas read_csv从csv文件导入了一个数据帧。它的形状是735,36。我需要删除最后33列-保留前3列。这些列是,, 我已经尝试了这里所有的建议 无论我做什么,我都会得到以下错误: 例如: 我又开始了。“bool对象不可下标”错误已经消失,我认为df已经被覆盖。 我试图使用一些公开的医院活动数据,并从中提取数据。我是一名神经外科医生,所以你可能需要耐心。数据在这里https:/

  • 假设我有以下数据 在这上面,我想在“品牌”和“城镇”两列上做一次性编码,以便训练分类器(比如用Scikit学习)并预测年份。 一旦分类器被训练,我将希望根据新的输入数据预测年份(不在训练中使用),我将需要重新应用相同的热编码。例如: 在这种情况下,如果知道需要对多个列进行编码,并且需要能够在以后对新数据应用相同的编码,那么对Pandas数据帧上的2列进行一次热编码的最佳方法是什么。 这是如何在Sk

  • 问题内容: 在Ubuntu下全新安装的Anaconda …在使用Scikit-Learn进行分类任务之前,我将以各种方式预处理数据。 这一切都很好,但是如果我有一个要分类的新样本(下面的温度)(因此我想以相同的方式进行预处理,那么我会 然后我会收到弃用警告… 所以问题是我应该如何像这样缩放单个样本? 我想一种替代方法(不是很好)是… 但是我相信有更好的方法。 问题答案: 只需听听警告告诉您的内容:

  • 我正在尝试使用Scikit-Learn的来编码字符串标签的pandas。由于dataframe有许多(50+)列,我希望避免为每个列创建对象;我宁愿只有一个大的对象,它可以跨我的所有数据列工作。 将整个抛入会产生以下错误。请记住,我在这里使用的是虚拟数据;实际上,我正在处理大约50列字符串标记的数据,因此需要一个不引用任何列名称的解决方案。 回溯(最近一次调用):文件“”,第1行,在文件“/use

  • 我正在查看代码中的一个错误,其中一个数据框被分成了太多的分区(超过700个),当我试图将它们重新分区为48个时,这会导致太多的洗牌操作。我不能在这里使用coalesce(),因为我想在重新分区之前首先拥有更少的分区。 我正在寻找减少分区数量的方法。假设我有一个 spark 数据帧(具有多个列),分为 10 个分区。我需要根据其中一列进行 orderBy 转换。完成此操作后,生成的数据帧是否具有相同

  • 问题内容: 我可以使用scikit- learn中的文本或参数从文本文档中保留!,?,“和’的标点符号吗? 问题答案: 实例化矢量化程序时,应自定义参数。例如: