我有一个pandas数据帧,它有一些行和列。每列都有一个标题。现在,只要我继续在panda中进行数据操作,我的变量头就会保留下来。但是,如果我尝试Sci-kit-stear-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数据帧进行一些数据操作时,我希望保留列名。
scikit-learn在大多数情况下确实会剥离列标题,所以之后只需重新添加即可。在您的示例中,X_imputed
作为sklearn.preprocessing
输出,X_train
作为原始数据帧,您可以使用重新放置列标题
X_imputed_df = pd.DataFrame(X_imputed, columns = X_train.columns)
以上答案仍然不能解决主要问题。这里有两个隐含的假设
- 数据集的所有特征都将被保留,这可能不是真的。例如,某种功能选择功能
- 所有特征都将以相同的顺序保留,同样,在一些特征选择转换中可能存在隐式排序
;get_support()"方法中的至少一些拟合和变换函数,这些函数保存关于哪些列(特征)被保留以及以何种顺序保留的信息。
你可以在这里查看该函数的基础知识以及如何使用它。。。在此处查找get_support()函数描述
这将是获得这里所需信息的最首选和官方方式。
根据Ami Tavory在这里的回复,根据文档,Imputter省略了空列或空行(无论您如何运行它)
因此,在运行Imputter并如上所述设置列名之前,请运行以下操作(针对列):
X_train=X_train.dropna(axis=1, how='all')
df.dropna在这里描述。
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()
改编自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