web-dev-qa-db-fra.com

Quels sont les niveaux dans un pandas DataFrame?

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?

16
Raf

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:

enter image description here

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
19
Andrzej Gis

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].

7
John Zwinck