将数据帧的行索引保留在差异阈值转换



我正在熊猫数据帧上使用sklearn进行方差阈值特征选择。为了避免特征选择的偏差 - VarianceThreshold只是第一步 - 我将原始数据集分为用于特征选择的部分(X_selection,y_selection)和用于建模的部分(X_model,y_model)。但是,它们以相同的顺序包含相同的列。因此,我首先定义选择器,然后拟合数据:

# get column names
X_columns = X_selection.columns
# doing the variance threshold feature selection
selector = VarianceThreshold()
selector.fit(X_selection)
# filtering the selected column names
X_columns = X_columns[selector.get_support()]
# transform original data according to selector
X_selection = pd.DataFrame(selector.transform(X_selection), columns = X_columns)
X_model = pd.DataFrame(selector.transform(X_model), columns = X_columns)

不幸的是,我遇到生成的X_selectionX_model中的行是混乱的。例如,在转换之前,我有一些示例行X_model

COL_X
0       0.000000
1       0.000000
2       0.000000
10      0.000000
25      0.185185
150     0.037037
3333    0.000000
16000   0.000000

转换后,调用相同的行索引 X_model 给我:

COL_X
0       0.000000
1       0.000000
2       0.111111
10      0.000000
25      0.000000
150     0.000000
3333    0.000000
16000   0.111111

在我的理解中,转换以一种对我来说未知的方式洗牌了行。尽管与带有类标签的y_model数组的关系被破坏了,因为此处的行顺序保持不变。感谢您对如何修复它或我的错误隐藏在哪里的任何评论。

我不知道的事实是,当再次将转换结果数组转换为熊猫数据帧时,pandas 会为数据帧分配新的索引(从 0 开始,增量为 1):

X_model = pd.DataFrame(selector.transform(X_model), columns = X_columns)

当请求具有"旧"行索引的行子集时,这会给出比以前不同的值。所以,顺序还是一样。但是,我想保留原始行索引。因此,我现在根据y_model中仍保留的旧索引设置索引。

X_model = X_model.set_index(y_model.index)

最新更新