[PYTHON] Ich habe einen Fehler beim Abrufen der Hierarchie mit MultiIndex von Pandas gemacht

MultiIndex von Pandas ist praktisch, aber ich war süchtig danach, es einfach als mehrdimensionale Version von Index zu behandeln, also notieren Sie es sich.

Ich war süchtig nach

Angenommen, die folgende Tabelle ist als "hoge.csv" vorhanden.

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

Wenn Sie andere Spalten als val in hoge.csv als Index lesen, wird dies als DataFrame von MultiIndex gelesen.

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

Versuchen Sie, diesen entsprechenden DataFrame mit val zu filtern

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

Aus dem DataFrame aller fünf Elemente wurden zwei Elemente extrahiert.

Wenn Sie außerdem die 0. Ebene der Eigenschaft "Ebenen" für das gefilterte Ergebnis erhalten, erhalten Sie möglicherweise "1,5" ...

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

Unabhängig vom Filter ** Die Elemente der 0. Ebene des ursprünglichen DataFrame werden abgerufen ** Dies ist ein Problem, da Sie manchmal die Werte jeder Ebene im Status nach dem Filtern extrahieren möchten, indem Sie Bedingungen für die Werte in der Tabelle festlegen.

Lösung

Ebenen sind nur eine Liste, in der die in jeder Ebene enthaltenen Elemente gespeichert sind, und es scheint, dass sie durch Kombinieren durch Definieren der Beziehung zwischen den einzelnen Ebenen realisiert werden.

Brechen Sie daher MultiIndex ab, um einen einzelnen Index zu erstellen, der die Hierarchie verlässt, die Sie endgültig abrufen möchten, und wenden Sie dann einen Filter an.

>>> 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')

Wenn Sie dies tun, entspricht der Index dem Element des Filters. Wenn Sie also nach dem Filtern eine bestimmte Hierarchie abrufen möchten, müssen Sie wie oben beschrieben mit "reset_index" korrespondieren.

Wenn in reset_index der Spaltenname von MultiIndex gelöscht wird, geben Sie den Namen an, und wenn nicht, geben Sie die Nummer der Hierarchie an, die im Argument von level = freigegeben werden soll.

Recommended Posts

Ich habe einen Fehler beim Abrufen der Hierarchie mit MultiIndex von Pandas gemacht
Ich habe GAN mit Keras gemacht, also habe ich ein Video des Lernprozesses gemacht.
Ich habe ein Programm erstellt, um die Größe einer Datei mit Python zu überprüfen
Ich habe einen Appdo-Befehl erstellt, um Befehle im Kontext der App auszuführen
Ich habe eine Twitter-App erstellt, die die Zeichen der Vorverbindung mit Heroku entschlüsselt (Fehler).
Ich habe ein einfaches Tippspiel mit tkinter of Python gemacht
Ich habe ein Punktbild des Bildes von Irasutoya gemacht. (Teil 1)
Ich habe ein Punktbild des Bildes von Irasutoya gemacht. (Teil 2)
Ich habe eine Klasse erstellt, um das Analyseergebnis von MeCab in ndarray mit Python zu erhalten
Ich habe mit Python eine Lotterie gemacht.
Ich habe mit Python einen Daemon erstellt
Verarbeiten Sie den Inhalt der Datei der Reihe nach mit einem Shell-Skript
Ich habe ein Programm erstellt, das die Fehlersuche in Sekunden löst
[Einführung in StyleGAN] Ich habe mit "The Life of a Man" ♬ gespielt
Ich habe viele Dateien für die RDP-Verbindung mit Python erstellt
Ich habe die Grundoperation von Pandas im Jupyter Lab geschrieben (Teil 1)
Ich habe den Befehl gegeben, einen farbenfrohen Kalender im Terminal anzuzeigen
Ich habe ein Programm erstellt, das den Tierkreis mit tkinter automatisch berechnet
Ich habe die grundlegende Operation von Pandas im Jupyter Lab geschrieben (Teil 2).
[Kaggle] Ich habe mit dem Titanic-Tutorial eine Sammlung von Problemen erstellt
Ich habe ein Pay-Management-Programm in Python erstellt!
Ich habe mit Python einen Zeichenzähler erstellt
Ich habe mit Python eine Hex-Map erstellt
Ich habe ein Lebensspiel mit Numpy gemacht
Ich habe mit Python ein schurkenhaftes Spiel gemacht
Ich habe mit Python einen einfachen Blackjack gemacht
Ich habe mit Python eine Einstellungsdatei erstellt
Ich habe eine WEB-Bewerbung bei Django gemacht
Ich habe mit Python einen Neuronensimulator erstellt
Ich habe einen Kalender erstellt, der den Verteilungsplan von Vtuber automatisch aktualisiert
Generieren Sie eine Liste mit der Anzahl der Tage im aktuellen Monat.
[Django] Erstellt ein Feld zur Eingabe von Daten mit 4-stelligen Zahlen
Ich habe eine Art einfaches Bildverarbeitungswerkzeug in der Sprache Go erstellt.
Erhalten Sie eine Liste der Ergebnisse der Parallelverarbeitung in Python mit Starmap
Ich habe versucht, den Höhenwert von DTM in einem Diagramm anzuzeigen
Ich habe eine Funktion erstellt, um die Bewegung eines zweidimensionalen Arrays (Python) zu sehen.
Ich habe mit Heroku + Flask + PostgreSQL (Heroku Postgres) einen LINE-Bot erstellt, der mir den Typ und die Stärke von Pokemon in der Garal-Region angibt.
Ich habe ein Tool erstellt, um die Ausführungszeit von cron zu schätzen (+ PyPI-Debüt)
Ich habe einen Stempelersatzbot mit Linie gemacht
Ich habe die Pivot-Table-Funktion von Pandas ausprobiert
[Python] Holen Sie sich die Dateien mit Python in den Ordner
Fühlen Sie sich frei, einen Test mit der Nase zu schreiben (im Fall von + gevent)
Darstellung von Containern in einem verschachtelten Rahmen (schematisch) in Jupyter und was ich bei der Erstellung untersucht habe
Sammlung von Numpy, Pandas Tipps, die häufig auf dem Feld verwendet werden
Ich habe mit Python eine Bot-Wettervorhersage gemacht.
Ich habe eine GUI-App mit Python + PyQt5 erstellt
Ich habe Pygame mit Python 3.5.1 in der Umgebung von pyenv unter OS X installiert
Sprechen Sie über die Funktionen, für die Pandas und ich im Projekt verantwortlich waren
Holen Sie sich den Aufrufer einer Funktion in Python
Ich habe versucht, mit Python einen Twitter-Blocker für faule Mädchen zu machen
So geben Sie mit Jupyter Notebook einen Wert in der Mitte einer Zelle aus
[Python & SQLite] Ich habe den erwarteten Wert eines Rennens mit Pferden im 1x-Gewinnbereich ① analysiert
Kopieren Sie die Liste in Python
[Python] Ich habe mit Tkinter einen Youtube Downloader erstellt.
Beachten Sie die Lösung, da Django nicht mit pip installiert werden konnte
Finden Sie die Anzahl der Tage in einem Monat
Mit LINEBot habe ich eine Anwendung erstellt, die mich über die "Buszeit" informiert.
Ich möchte einen Lebenszyklus in der Aufgabendefinition von ECS festlegen
Ich habe eine einfache Brieftasche aus Bitcoin mit Pycoin gemacht
Ich habe einen LINE Bot mit Serverless Framework erstellt!
Ich habe den gleitenden Durchschnitt des IIR-Filtertyps mit Pandas und Scipy verglichen