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)
小智 7
上面的回答仍然没有解决主要问题。这里有两个隐含的假设
至少在一些拟合和变换函数中有一个“get_support()”方法,用于保存有关保留哪些列(特征)以及保留顺序的信息。
您可以在此处查看该函数的基础知识以及如何使用它... 在此处查找 get_support() 函数描述
这将是获取此处所需信息的最首选和官方方式。
根据Ami Tavory 的回复,根据文档,Imputer 会忽略空列或空行(无论您如何运行它)。
因此,在运行 Imputer 并按上述方式设置列名称之前,请运行如下命令(对于列):
X_train=X_train.dropna(axis=1, how='all')
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
18557 次 |
最近记录: |