#python #pandas #pandas-groupby
#python #pandas #pandas-groupby
Вопрос:
У меня есть фрейм данных, подобный этому:
Model R2 RMSE Average_CV Destiny
0 Ada Boost 0.5563 125.2569 0.426166 REC
1 Bagging Regressor 0.8363 76.0865 0.582675 REC
2 Random Forest 0.8378 75.7304 0.590683 REC
3 Decision Tree 0.8366 76.0053 0.460394 REC
Как я могу получить вывод ниже?
Model Metrica REC
Ada Boost Average_CV 0.426166
R2 0.5563
RMSE 125.2569
Bagging Regressor Average_CV 0.582675
R2 0.8363
RMSE 76.0865
Decision Tree Average_CV 0.590683
R2 0.8366
RMSE 76.0053
Random Forest Average_CV 0.460394
R2 0.8378
RMSE 75.7304
Я пытался groupby, транспонировать и даже перекрестную таблицу. Но я понятия не имею, как получить желаемый результат.
Не имеет значения порядок строк в метрике столбца в выходных данных.
Спасибо
Ответ №1:
Если Destiny всегда Rec, вы можете сделать простой melt
. Затем вы можете установить и отсортировать индекс, чтобы получить желаемый результат.
df.melt(id_vars="Model", value_vars=["R2", "RMSE", "Average_CV"], var_name="Metrica")
Model Metrica value
0 Ada_Boost R2 0.556300
1 Bagging_Regressor R2 0.836300
2 Random_Forest R2 0.837800
3 Decision_Tree R2 0.836600
4 Ada_Boost RMSE 125.256900
5 Bagging_Regressor RMSE 76.086500
6 Random_Forest RMSE 75.730400
7 Decision_Tree RMSE 76.005300
8 Ada_Boost Average_CV 0.426166
9 Bagging_Regressor Average_CV 0.582675
10 Random_Forest Average_CV 0.590683
11 Decision_Tree Average_CV 0.460394
С настройкой / сортировкой индекса:
(df.melt(id_vars="Model", value_vars=["R2", "RMSE", "Average_CV"], var_name="Metrica")
.set_index(["Model", "Metrica"])
.sort_index())
value
Model Metrica
Ada_Boost Average_CV 0.426166
R2 0.556300
RMSE 125.256900
Bagging_Regressor Average_CV 0.582675
R2 0.836300
RMSE 76.086500
Decision_Tree Average_CV 0.460394
R2 0.836600
RMSE 76.005300
Random_Forest Average_CV 0.590683
R2 0.837800
RMSE 75.730400
Если ваша судьба имеет несколько значений, и вам нужен 1 столбец для каждого из этих значений, тогда вам придется немного пофантазировать
(df.melt(id_vars="Model", value_vars=["R2", "RMSE", "Average_CV"], var_name="Metrica")
.merge(df[["Model", "Destiny"]], on="Model")
.pivot_table(index=["Model", "Metrica"], columns="Destiny", values="value")
.rename_axis(None, axis=1)
)
REC
Model Metrica
Ada_Boost Average_CV 0.426166
R2 0.556300
RMSE 125.256900
Bagging_Regressor Average_CV 0.582675
R2 0.836300
RMSE 76.086500
Decision_Tree Average_CV 0.460394
R2 0.836600
RMSE 76.005300
Random_Forest Average_CV 0.590683
R2 0.837800
RMSE 75.730400
Комментарии:
1. Я действительно ценю ваш ответ. В моем столбце Destiny у меня есть несколько значений. Другими словами, ваш третий код — это то, что мне нужно. Я протестировал это здесь, но я получил ошибку: ValueError: функция не уменьшает, я выясняю это с помощью цикла по назначению и присоединяюсь к фрейму данных. Еще раз, большое спасибо.
2. ах, извините за это. удалить
aggfunc=lambda x: x
изpivot_table
функции. После этого должно работать так, как ожидалось.3. Большое спасибо. 100% правильно. Это сработало как шарм. Спасибо, спасибо.