Python 如何使用具有更高功能分数的选定列附加dataframe

Python 如何使用具有更高功能分数的选定列附加dataframe,python,pandas,dataframe,feature-selection,Python,Pandas,Dataframe,Feature Selection,嗨,我是python新手,如果问题不清楚,请告诉我。 这是我的数据框: df = pd.DataFrame(df_test) 我正在使用卡方检验对该数值数据应用选择“k”最佳特征选择 X_clf = numeric_data.iloc[:,0:(col_len-1)] y_clf = numeric_data.iloc[:,-1] bestfeatures = SelectKBest(score_func=chi2, k=2) fit = bestfeatures.fit(X_clf,y_c

嗨,我是python新手,如果问题不清楚,请告诉我。 这是我的数据框:

df = pd.DataFrame(df_test)
我正在使用卡方检验对该数值数据应用选择“k”最佳特征选择

X_clf = numeric_data.iloc[:,0:(col_len-1)] 
y_clf = numeric_data.iloc[:,-1]
bestfeatures = SelectKBest(score_func=chi2, k=2)
fit = bestfeatures.fit(X_clf,y_clf)
dfscores = pd.DataFrame(fit.scores_)
dfcolumns = pd.DataFrame(X_clf.columns)
featureScores = pd.concat([dfcolumns,dfscores],axis=1)
这是我的输出:

现在我希望附加我的数据框,只包含得分最高的两个特性。但是,我希望在添加到数据帧时不必对列名进行硬编码

我曾尝试将列名存储到列表中,并附加得分最高的列名,但得到一个值错误。是否有任何方法/功能可以通过存储选定的列,然后根据它们的分数添加它们来尝试

预期输出:“bmi”列不存在,因为它的得分最低,为3分


我认为您需要处理数据帧
featureScores
,以保持前两个具有最高
scores
的功能,然后使用此值作为列表来过滤原始数据帧中的列。大致如下:

important_features = featureScores.sort_values('Score',ascending=False)['Feature'].values.tolist()[:2] + ['charges']
filtered_df = df[important_features]
sort_values()
用于确保将功能(如果有更多功能)从最高分数排序到最低分数。然后,我们将使用
.values.tolist()[:2]
创建列
功能
(已排序)的前2个值的列表。由于您似乎还希望在输出中包含列
charges
,因此我们将在重要功能列表中手动添加
+['charges']

最后,我们通过仅从原始
df
中选择
重要的
列来创建
过滤的

根据评论进行编辑: 如果您可以保证
费用
将是原始
df
中的最后一列,那么您只需执行以下操作:

important_features = featureScores.sort_values('Score',ascending=False)['Feature'].values.tolist()[:2] + [df.columns[-1]]
filtered_df = df[important_features]

我看到您之前使用
y\u clf=numeric\u data.iloc[:,-1]
定义了
y
列,然后可以使用
y\u clf.columns
[df.columns[-1]
,两者都可以正常工作。

我认为您需要使用数据框
功能得分
来保留前两个得分最高的功能,然后使用此值作为列表来过滤原始数据框中的列。大致如下:

important_features = featureScores.sort_values('Score',ascending=False)['Feature'].values.tolist()[:2] + ['charges']
filtered_df = df[important_features]
sort_values()
用于确保将功能(如果有更多功能)从最高分数排序到最低分数。然后,我们将使用
.values.tolist()[:2]
创建列
功能
(已排序)的前2个值的列表。由于您似乎还希望在输出中包含列
charges
,因此我们将在重要功能列表中手动添加
+['charges']

最后,我们通过仅从原始
df
中选择
重要的
列来创建
过滤的

根据评论进行编辑: 如果您可以保证
费用
将是原始
df
中的最后一列,那么您只需执行以下操作:

important_features = featureScores.sort_values('Score',ascending=False)['Feature'].values.tolist()[:2] + [df.columns[-1]]
filtered_df = df[important_features]

我知道您之前已经使用
y\u clf=numeric\u data.iloc[:,-1]
定义了
y
列,然后可以使用
y\u clf.columns
[df.columns[-1]]
,两者都可以正常工作。

因此,首先您要找出哪些功能具有最大的值,然后查找不希望看到的列的Featurename

colToDrop = feature.iloc[~feature['Score'].nlargest(2)]['Feature'].values
接下来,我们只需过滤原始df并从columns列表中删除这些列

df[df.columns.drop(colToDrop)]

因此,首先要找出哪些要素的值最大,然后找到不希望看到的列的要素名称

colToDrop = feature.iloc[~feature['Score'].nlargest(2)]['Feature'].values
接下来,我们只需过滤原始df并从columns列表中删除这些列

df[df.columns.drop(colToDrop)]

您希望将功能和分数数据附加到哪些列?@BenPap我希望附加分数最高的功能列(在本例中为年龄和儿童,并删除bmi)添加到我的数据框中,以便仅选择重要的功能作为我的数据框的一部分。您希望将功能和分数数据附加到哪些列?@BenPap我希望附加分数最高的功能列(在本例中为年龄和儿童,并删除bmi)添加到我的dataframe,以便只选择重要的功能作为我的dataframe的一部分是的,谢谢,这似乎可以解决问题。如果我不硬编码目标列(在本例中为“费用”)就可以做同样的事情吗?问题是,您希望事先定义X和Y列,然后将
Y
列作为参数传递,而不必硬编码
charges
。必须至少有一个时间点需要告诉python目标列是
charges
,否则它不可能知道。除非您能保证
费用
将始终是原始数据框中的最后一列,在这种情况下,您可以查看我的编辑。如果答案有助于您解决问题,请随时接受,或者如果您还有其他问题,请告诉我是的,谢谢这似乎可以解决问题。如果我不硬编码目标列(在本例中为“费用”)就可以做同样的事情吗?问题是,您希望事先定义X和Y列,然后将
Y
列作为参数传递,而不必硬编码
charges
。必须至少有一个时间点需要告诉python目标列是
charges
,否则它不可能知道。除非您能保证
费用
始终是原始数据框中的最后一列,在这种情况下,您可以检查我的编辑。如果答案有助于您解决问题,请随时接受,或者如果您还有其他问题,请通知我