J'ai lu la documentation et de nombreuses explications et exemples utilisent levels
comme quelque chose pris pour acquis. À mon humble avis, les documents manquent un peu d'une explication fondamentale de la structure des données et des définitions.
Quels sont les niveaux dans une trame de données? Quels sont les niveaux dans un index MultiIndex
?
Je suis tombé sur cette question en analysant la réponse à ma propre question , mais je n'ai pas trouvé la réponse de John assez satisfaisante. Après quelques expériences, je pense avoir compris les niveaux et décidé de partager:
Réponse courte:
Les niveaux font partie de l'index ou de la colonne.
Réponse longue:
Je pense que cet exemple multi-colonnes gorupby
illustre assez bien les niveaux d'index.
Supposons que nous ayons le temps connecté sur les données du rapport sur les problèmes:
report = pd.DataFrame([
[1, 10, 'John'],
[1, 20, 'John'],
[1, 30, 'Tom'],
[1, 10, 'Bob'],
[2, 25, 'John'],
[2, 15, 'Bob']], columns = ['IssueKey','TimeSpent','User'])
IssueKey TimeSpent User
0 1 10 John
1 1 20 John
2 1 30 Tom
3 1 10 Bob
4 2 25 John
5 2 15 Bob
L'index ici n'a qu'un seul niveau (il n'y a qu'une seule valeur d'index identifiant chaque ligne). L'index est artificiel (nombre courant) et se compose de valeurs de 0 à 5.
Disons que nous voulons fusionner (additionner) tous les journaux créés par le même utilisateur pour le même problème (pour obtenir le temps total passé sur le problème par l'utilisateur)
time_logged_by_user = report.groupby(['IssueKey', 'User']).TimeSpent.sum()
IssueKey User
1 Bob 10
John 30
Tom 30
2 Bob 15
John 25
Maintenant, notre index de données a 2 niveaux, car plusieurs utilisateurs ont enregistré l'heure sur le même problème. Les niveaux sont IssueKey
et User
. Les niveaux font partie de l'index (seulement ensemble, ils peuvent identifier une ligne dans un DataFrame/Series).
Les niveaux faisant partie de l'index (en tant que tuple) peuvent être bien observés dans l'explorateur de variables Spyder:
Avoir des niveaux nous donne la possibilité d'agréger des valeurs au sein de groupes par rapport à une partie d'index ( niveau ) de notre choix. Par exemple. si nous voulons attribuer le temps maximum consacré à un problème par n'importe quel utilisateur, nous pouvons:
max_time_logged_to_an_issue = time_logged_by_user.groupby(level='IssueKey').transform('max')
IssueKey User
1 Bob 30
John 30
Tom 30
2 Bob 25
John 25
Maintenant, les 3 premières lignes ont la valeur 30
, car ils correspondent au problème 1
(User
level a été ignoré dans le code ci-dessus). La même histoire pour le numéro 2
.
Cela peut être utile, par exemple si nous voulons savoir quels utilisateurs ont passé le plus de temps sur chaque problème:
issue_owners = time_logged_by_user[time_logged_by_user == max_time_logged_to_an_issue]
IssueKey User
1 John 30
Tom 30
2 John 25
Habituellement, un DataFrame a un index et des colonnes 1D:
x y
0 4 1
1 3 9
Ici, l'index est [0, 1] et les colonnes sont ['x', 'y']. Mais vous pouvez avoir plusieurs niveaux dans l'index ou les colonnes:
x y
a b c
0 7 4 1 3
8 3 9 5
Ici, le premier niveau des colonnes est ['x', 'y', 'y'] et le deuxième niveau est ['a', 'b', 'c']. Le premier niveau de l'index est [0, 0] et le deuxième niveau est [7, 8].