将DataFrame的行索引保持在Variance Threshold转换

问题描述 投票:1回答:1

我在pandas DataFrame上使用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_selection和X_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数组的关系被破坏了,因为这里的行顺序没有变化。感谢您提供任何意见,如何解决或隐藏我的错误。

python pandas numpy scikit-learn feature-selection
1个回答
0
投票

我不知道的事实是,当将得到的转换数组再次转换为pandas DataFrame时,pandas会将新索引(从0开始,递增1)分配给DataFrame:

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

当要求具有“旧”行索引的行的子集时,这给出了比以前更多的其他值。所以,序列仍然是相同的。但是,我想保留原始的行索引。因此,我现在根据仍保留在y_model中的旧索引设置索引。

X_model = X_model.set_index(y_model.index)
© www.soinside.com 2019 - 2024. All rights reserved.