保持DataFrame的行索引为方差阈值转换

时间:2018-03-01 12:53:47

标签: python pandas numpy scikit-learn feature-selection

我在pandas DataFrame上使用sklearn进行方差阈值功能选择。为了避免特征选择产生偏差 - VarianceThreshold只是第一步 - 我将原始数据集划分为特征选择部分( X_selection ,< strong> 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 数组的关系被破坏了,因为这里的行顺序没有变化。感谢您提供任何意见,如何解决或隐藏我的错误。

1 个答案:

答案 0 :(得分:0)

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

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

在使用&#34; old&#34;来询问行的子集时行索引,这给出了以前的其他值。所以,序列仍然是相同的。但是,我想保留原始的行索引。因此,我现在根据仍保留在 y_model 中的旧索引设置索引。

X_model = X_model.set_index(y_model.index)