Ich arbeite mit einem Pandas DataFrame, der ein Diagramm darstellt. Der Datenrahmen wird durch einen MultiIndex indiziert, der die Endpunkte des Knotens angibt.
Setup:
%Vor% Ich möchte in der Lage sein, mit einer Kanten-Teilmenge in den Graphen zu indizieren, weshalb ich mich für die Verwendung von MultiIndex
entschieden habe. Ich kann das gut machen, solange die Eingabe in df.loc
eine Liste von Tupeln ist.
Wenn meine Liste von Kanten jedoch ein numpliges Array ist (wie es oft der Fall ist) oder eine Liste von Listen, dann kann ich die Eigenschaft df.loc
nicht verwenden.
Es wäre in Ordnung, wenn ich nur alle arr.tolist()
hätte, aber das führt zu einem scheinbar anderen Fehler.
Es ist ein echter Schmerz, list(map(tuple, arr.tolist()))
jedes Mal verwenden zu müssen, wenn ich eine Teilmenge auswählen möchte. Es wäre schön, wenn es einen anderen Weg gäbe, dies zu tun.
Die Hauptaufgaben sind:
Warum kann ich kein numerisches Array mit .loc
verwenden? Liegt es daran, dass unter der Haube ein Wörterbuch verwendet wird, um die Multiindex-Labels Positionsindizes zuzuordnen?
Warum gibt eine Liste von Listen einen anderen Fehler? Vielleicht ist es wirklich das gleiche Problem, es ist nur auf eine andere Art und Weise gefangen?
Gibt es eine andere (idealerweise weniger ausführliche) Möglichkeit, eine Teilmenge eines Datenrahmens mit einer Reihe von Multi-Index-Labels zu durchsuchen, von denen ich nichts weiß?
Ein Wörterbuchschlüssel ist unveränderlich, das ist im Grunde, warum Sie nicht eine Liste von Listen verwenden können, um auf Multiindex zuzugreifen.
Um mit loc
auf multiindizierte Daten zugreifen zu können, müssen Sie das Array numpy
in eine Liste von Tupeln konvertieren; Tupel sind unveränderlich, ein Weg dazu ist map
zu verwenden, wie Sie
Wenn Sie die Verwendung von map vermeiden möchten und die Kanten aus einer CSV-Datei lesen, können Sie sie in einen Datenrahmen einlesen und to_records
mit dem index
-Attribut auf False
verwenden.
Ein anderer Weg könnte darin bestehen, einen Multi-Index aus ndarray
zu erstellen, aber Sie müssen die Liste transponieren, bevor Sie sie übergeben, so dass jede Ebene eine Liste im Array ist
Ich fand den Artikel erweiterte Multi-Indizierung in der Pandas-Dokumentation sehr hilfreich
>