Как добавить фрейм данных с выбранными столбцами, имеющими более высокую оценку функции - PullRequest
1 голос
/ 17 июня 2020

Привет, я новичок в python, дайте мне знать, если вопрос не ясен. Вот мой фрейм данных:

df = pd.DataFrame(df_test)
    age     bmi     children      charges
0   19    27.900         0     16884.92400
1   18    33.770         1     1725.55230
2   28    33.000         3     4449.46200
3   33    22.705         0     21984.47061

Я применяю выбор лучших функций select '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)

Это мой результат:

    Feature        Score
0       age     6703.764216
1       bmi     1592.481991
2  children     1752.136519

Я хочу sh, чтобы теперь добавить мой фрейм данных, чтобы он содержал только функции с двумя наивысшими баллами. Однако я должен sh сделать это без жесткого кодирования имен столбцов при добавлении в мой фрейм данных.

Я попытался сохранить имена столбцов в список и добавить те, которые имеют наивысший балл, но я получаю ошибку значения. Есть ли какой-либо метод / функция, которые я мог бы попробовать, сохранив выбранные столбцы и затем добавив их на основе их оценок?

Ожидаемый результат: столбца «bmi» нет, так как он имеет самый низкий из 3 баллов

      age     children      charges
 0      19         0     16884.92400
 1      18         1     1725.55230
 2      28         3     4449.46200
 3      33         0     21984.47061

Ответы [ 2 ]

0 голосов
/ 17 июня 2020

Итак, сначала вы хотите узнать, какие функции имеют наибольшие значения, а затем найдите Featurename столбцов, которые вы не хотите видеть.

colToDrop = feature.iloc[~feature['Score'].nlargest(2)]['Feature'].values

Затем мы просто фильтруем исходный df и удаляем их столбцы из списка столбцов

df[df.columns.drop(colToDrop)]
0 голосов
/ 17 июня 2020

Я считаю, что вам нужно работать с фреймом данных featureScores, чтобы сохранить первые 2 функции с наивысшим Score, а затем использовать эти значения в качестве списка для фильтрации столбцов в исходном фрейме данных. Что-то вроде:

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

sort_values() необходимо для того, чтобы функции (в случае, если их больше) отсортированы от наивысшей оценки до самой низкой. Затем мы создаем список из первых двух значений столбца Feature (который уже отсортирован) с помощью .values.tolist()[:2]. Поскольку вы, кажется, также хотите включить столбец charges в свой вывод, мы добавляем его вручную с +['charges'] в наш список important_features.

Наконец, мы создаем filtered_df, выбирая только столбцы important_features из исходного df.

Редактировать на основе комментариев:

Если вы можете гарантировать, что charges будет последним столбцом в исходном df, тогда вы можно просто сделать:

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

Я вижу, что вы ранее определили свой столбец y с y_clf = numeric_data.iloc[:,-1], затем вы можете использовать y_clf.columns или [df.columns[-1]], любой из них должен работать нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...