[PYTHON] J'ai fait une erreur en récupérant la hiérarchie avec MultiIndex of pandas

MultiIndex de pandas est pratique, mais j'étais accro à simplement le traiter comme une version multidimensionnelle d'Index, alors prenez-en note.

J'étais accro à

À titre d'exemple, supposons que le tableau suivant existe sous le nom «hoge.csv».

val
1 a b
2 c d
3 a d
4 b c
5 a b

Si vous lisez les colonnes autres que val dans hoge.csv comme index, elles seront lues comme DataFrame de MultiIndex.

>>> import pandas as pd
>>> df = pd.read_csv("hoge.csv", index_col=[0, 1])
>>> df
    val
1 a   b
2 c   d
3 a   d
4 b   c
5 a   b

Essayez de filtrer ce DataFrame approprié avec val

>>> tmp_df = df.query("val=='b'")
>>> tmp_df.index
MultiIndex([(1, 'a'),
            (5, 'a')],
           )

Deux éléments ont été extraits du DataFrame des cinq éléments.

De plus, si vous obtenez la 0ème couche de la propriété levels pour le résultat filtré, vous pourriez obtenir1,5 ...

>>> tmp_df.index.levels[0]
Int64Index([1, 2, 3, 4, 5], dtype='int64')

Quel que soit le filtre ** Les éléments de la 0ème couche du DataFrame d'origine sont récupérés ** Cela pose un problème car vous souhaitez parfois extraire les valeurs de chaque couche dans l'état après filtrage en définissant des conditions pour les valeurs du tableau.

Solution

Niveaux est juste une liste qui stocke les éléments inclus dans chaque niveau, et il semble que cela soit réalisé en combinant en définissant la relation entre chaque niveau.

Par conséquent, annulez MultiIndex pour en faire un seul index qui quitte la hiérarchie que vous souhaitez finalement récupérer, puis appliquez un filtre.

>>> df.reset_index(level=1)
  level_1 val
1       a   b
2       c   d
3       a   d
4       b   c
5       a   b
>>> tmp_df = df.reset_index(level=1).query("val=='b'")
>>> tmp_df.index
Int64Index([1, 5], dtype='int64')

Si vous faites cela, l'Index sera le même que l'élément du filtre, donc si vous voulez récupérer une certaine hiérarchie après le filtrage, vous devez correspondre avec reset_index comme décrit ci-dessus.

Dans reset_index, si le nom de colonne de MultiIndex est supprimé, spécifiez le nom, et sinon, spécifiez le numéro de la hiérarchie à libérer dans l'argument de level =.

Recommended Posts

J'ai fait une erreur en récupérant la hiérarchie avec MultiIndex of pandas
J'ai fait GAN avec Keras, donc j'ai fait une vidéo du processus d'apprentissage.
J'ai fait un programme pour vérifier la taille d'un fichier avec Python
J'ai créé une commande appdo pour exécuter des commandes dans le contexte de l'application
J'ai créé une application Twitter qui décrypte les caractères de pré-connexion avec heroku (échec)
J'ai fait un jeu de frappe simple avec tkinter de Python
J'ai fait une image ponctuelle de l'image d'Irasutoya. (partie 1)
J'ai fait une image ponctuelle de l'image d'Irasutoya. (partie 2)
J'ai créé une classe pour obtenir le résultat de l'analyse par MeCab dans ndarray avec python
J'ai fait une loterie avec Python.
J'ai créé un démon avec Python
Traitez le contenu du fichier dans l'ordre avec un script shell
J'ai créé un programme qui résout la recherche d'erreur en quelques secondes
[Introduction à StyleGAN] J'ai joué avec "The Life of a Man" ♬
J'ai créé beaucoup de fichiers pour la connexion RDP avec Python
J'ai écrit le fonctionnement de base de Pandas dans Jupyter Lab (partie 1)
J'ai fait une commande pour afficher un calendrier coloré dans le terminal
J'ai fait un programme qui calcule automatiquement le zodiaque avec tkinter
J'ai écrit le fonctionnement de base de Pandas dans Jupyter Lab (partie 2)
[Kaggle] J'ai fait une collection de problèmes en utilisant le didacticiel Titanic
J'ai fait un programme de gestion de la paie en Python!
J'ai fait un compteur de caractères avec Python
J'ai fait une carte hexadécimale avec Python
J'ai fait un jeu de vie avec Numpy
J'ai fait un jeu rogue-like avec Python
J'ai fait un simple blackjack avec Python
J'ai créé un fichier de configuration avec Python
J'ai fait une application WEB avec Django
J'ai fait un simulateur de neurones avec Python
J'ai fait un calendrier qui met à jour automatiquement le calendrier de distribution de Vtuber
Générez une liste contenant le nombre de jours du mois en cours.
[Django] a créé un champ pour saisir des dates avec des nombres à 4 chiffres
J'ai fait une sorte d'outil de traitement d'image simple en langage Go.
Recevez une liste des résultats du traitement parallèle en Python avec starmap
J'ai essayé d'afficher la valeur d'altitude du DTM dans un graphique
J'ai créé une fonction pour voir le mouvement d'un tableau à deux dimensions (Python)
J'ai créé un bot LINE qui me dit le type et la force de Pokémon dans la région de Garal avec Heroku + Flask + PostgreSQL (Heroku Postgres)
J'ai fait un outil pour estimer le temps d'exécution de cron (+ débuts de PyPI)
J'ai fait un robot de remplacement de tampon avec une ligne
J'ai essayé la fonction de tableau croisé dynamique des pandas
[Python] Récupérez les fichiers dans le dossier avec Python
N'hésitez pas à rédiger un test avec nez (dans le cas de + gevent)
Représenter des conteneurs dans un cadre imbriqué (schéma) dans Jupyter, et ce que j'ai étudié en cours de création
Collection de conseils Numpy, Pandas souvent utilisés sur le terrain
J'ai fait une prévision météo de type bot avec Python.
J'ai créé une application graphique avec Python + PyQt5
J'ai installé Pygame avec Python 3.5.1 dans l'environnement de pyenv sur OS X
Parlez des fonctionnalités dont les pandas et moi étions en charge dans le projet
Récupérer l'appelant d'une fonction en Python
J'ai essayé de créer un bloqueur de filles pourries sur Twitter avec Python ①
Pour générer une valeur au milieu d'une cellule avec Jupyter Notebook
[Python & SQLite] J'ai analysé la valeur attendue d'une course avec des chevaux dans la fourchette 1x win ①
Copiez la liste en Python
[Python] J'ai créé un téléchargeur Youtube avec Tkinter.
Notez la solution car django n'a pas pu s'installer avec pip
Trouvez le nombre de jours dans un mois
Avec LINEBot, j'ai fait une application qui m'informe de "l'heure du bus"
Je souhaite définir un cycle de vie dans la définition de tâche d'ECS
J'ai fait un simple portefeuille de Bitcoin avec pycoin
J'ai créé un Bot LINE avec Serverless Framework!
J'ai comparé la moyenne mobile du type de filtre IIR avec les pandas et scipy