Situation
J'ai un suit dataframe défini comme de pandas géants:Pandas: le regroupement et l'agrégation avec plusieurs fonctions
import pandas as pd
headers = ['Group', 'Element', 'Case', 'Score', 'Evaluation']
data = [
['A', 1, 'x', 1.40, 0.59],
['A', 1, 'y', 9.19, 0.52],
['A', 2, 'x', 8.82, 0.80],
['A', 2, 'y', 7.18, 0.41],
['B', 1, 'x', 1.38, 0.22],
['B', 1, 'y', 7.14, 0.10],
['B', 2, 'x', 9.12, 0.28],
['B', 2, 'y', 4.11, 0.97],
]
df = pd.DataFrame(data, columns=headers)
qui ressemble à ceci dans la sortie de la console:
Group Element Case Score Evaluation
0 A 1 x 1.40 0.59
1 A 1 y 9.19 0.52
2 A 2 x 8.82 0.80
3 A 2 y 7.18 0.41
4 B 1 x 1.38 0.22
5 B 1 y 7.14 0.10
6 B 2 x 9.12 0.28
7 B 2 y 4.11 0.97
Problème
Je souhaite effectuer une opération de regroupement et d'agrégation sur df
qui me donnera le résultat suivant dataframe:
Group Max_score_value Max_score_element Max_score_case Min_evaluation
0 A 9.19 1 y 0.41
1 B 9.12 2 x 0.10
Pour préciser plus en détail: J'aimerais groupe par la colonne Group
, puis appliquez l'agrégation pour obtenir les colonnes de résultat suivant:
Max_score_value
: valeur maximale du groupe de la colonneScore
.Max_score_element
: la valeur de la colonneElement
qui correspond à la valeur maximale du groupeScore
.Max_score_case
: la valeur de la colonneCase
qui correspond à la valeur maximale du groupeScore
.Min_evaluation
: la valeur minimale du groupe de la colonneEvaluation
.
Essayé jusqu'ici
Je suis venu avec le code suivant pour le regroupement et l'agrégation:
result = (
df.set_index(['Element', 'Case'])
.groupby('Group')
.agg({'Score': ['max', 'idxmax'], 'Evaluation': 'min'})
.reset_index()
)
print(result)
qui donne en sortie:
Group Score Evaluation
max idxmax min
0 A 9.19 (1, y) 0.41
1 B 9.12 (2, x) 0.10
Comme vous pouvez voir les données de base sont là, mais ce n'est pas tout à fait dans le format dont j'ai besoin. C'est la dernière étape avec laquelle je me bats. Est-ce que quelqu'un ici a de bonnes idées pour générer un dataframe de résultat dans le format que je cherche?
Oh, l'indice définissant explicitement et se joindre à ce qui suit est une belle amélioration. – tarashypka
Je suis heureux avec les excellentes réponses de toutes les affiches ici. Je pense que pour l'instant j'irai avec la solution avec 'join' de la réponse de Psidom ici, parce que j'aime la basse verbosité. C'est bon, c'est un peu plus lent, car les goulots d'étranglement dans les performances de mon programme actuel sont ailleurs. – Xukrao