[PYTHON] So ermitteln Sie die Speicheradresse des Pandas-Datenrahmenwerts

Der Datenrahmen von Pandas ist praktisch, aber ich bin mir nicht sicher, was die Speicherverwaltung betrifft. Ich war neugierig, wo und wie er tatsächlich platziert wurde, also habe ich ihn nachgeschlagen.

Umfragemethode

import pandas as pd
df = pd.DataFrame({'A': [1, 2], 'B': [3.0, 4.0], 'C': [5, 6]})
for block in df._data.blocks:
    memory_address = block.values.__array_interface__['data'][0]
    memory_hex = block.values.data.hex()
    print(f"({id(block)}) {block}")
    print(f"<{memory_address}> {memory_hex}")
    print()
(4886642416) FloatBlock: slice(1, 2, 1), 1 x 2, dtype: float64
<140474854679968> 00000000000008400000000000001040

(4886642608) IntBlock: slice(0, 4, 2), 2 x 2, dtype: int64
<140474585659872> 0100000000000000020000000000000005000000000000000600000000000000

Die Zahl in der spitzen Klammer ist die Speicheradresse, und die Zahl danach ist die hexadezimale Darstellung des Speicherwerts. Da die Spalten A und C beide Int-Werte sind, können Sie sehen, dass sie gemeinsam im Speicher zugeordnet sind. Aha?

Datenstruktur

Der Datenrahmen verwaltet Datenblöcke über eine Klasse namens BlockManger. Die Idee dazu ist der Artikel "[Eine Roadmap für umfangreiche wissenschaftliche Datenstrukturen in Python](https://wesmckinney.com/blog/a-roadmap-for-rich-scientific-data-structures-in-python/] des Autors von Pandas. ) ”Ist leicht zu verstehen.

Wenn Sie dem Typ der Variablen folgen, der im obigen Code angezeigt wird, ist dies wie folgt.

Sie können sehen, dass der Block das ndarray von NumPy enthält. Von nun an ist es die Welt von NumPy "2.2. Advanced NumPy - Scipy Lecture Notes Sie können die Speicheradresse mit ndarray .__ array_interface__ ['data'] [0] abrufen. Und da Sie die Speicheransicht mit ndarray.data` erhalten können, können Sie auch den Speicherwert anzeigen.

Beachten Sie, dass beim Drucken der Speicheransicht diese als "<Speicher bei 0x11b6a3ad0>" angezeigt wird. Dies ist jedoch die Adresse der Instanz der Speicheransicht, die sich von der Adresse des Werts unterscheidet. Weitere Informationen finden Sie unter "Numpy, Python3.6 - Kann nicht verstehen, warum die Adresse unterschiedlich ist? - Stapelüberlauf. warum-Adresse-ist-anders) ”.

Experiment

Lassen Sie uns einige einfache Datenrahmenoperationen durchführen und experimentieren, wie sich die Speicherzuordnung ändert.

df1 = df[0:1]
(4886726416) FloatBlock: slice(1, 2, 1), 1 x 1, dtype: float64
<140474854679968> 0000000000000840

(4886727088) IntBlock: slice(0, 4, 2), 2 x 1, dtype: int64
<140474585659872> 01000000000000000500000000000000

Das erste ist das Stück der ersten Zeile. Sie sehen, dass sich die Speicheradresse nicht geändert hat und der Referenzbereich kürzer geworden ist. Die Blockinstanz hat sich geändert.

df2 = df[1:2]
(4886798416) FloatBlock: slice(1, 2, 1), 1 x 1, dtype: float64
<140474854679976> 0000000000001040

(4886798896) IntBlock: slice(0, 4, 2), 2 x 1, dtype: int64
<140474585659880> 02000000000000000600000000000000

Dies ist der Slice in der zweiten Zeile. Da alle Speicheradressen +8 sind, können Sie sehen, dass sie sich auf denselben Speicherblock beziehen, indem Sie einfach den Zeiger verschieben.

df['D'] = [True, False]
(4886642416) FloatBlock: slice(1, 2, 1), 1 x 2, dtype: float64
<140474854679968> 00000000000008400000000000001040

(4886642608) IntBlock: slice(0, 4, 2), 2 x 2, dtype: int64
<140474585659872> 0100000000000000020000000000000005000000000000000600000000000000

(4886800144) BoolBlock: slice(3, 4, 1), 1 x 2, dtype: bool
<140474855093504> 0100

Fügen Sie eine Spalte hinzu. Bei vorhandenen Spalten ändert sich nicht nur die Speicheradresse, sondern auch der Block nicht.

df3 = df.append(df)
(4886726224) IntBlock: slice(0, 1, 1), 1 x 4, dtype: int64
<140474855531008> 0100000000000000020000000000000001000000000000000200000000000000

(4509301648) FloatBlock: slice(1, 2, 1), 1 x 4, dtype: float64
<140474585317312> 0000000000000840000000000000104000000000000008400000000000001040

(4509301840) IntBlock: slice(2, 3, 1), 1 x 4, dtype: int64
<140474585630688> 0500000000000000060000000000000005000000000000000600000000000000

(4509301552) BoolBlock: slice(3, 4, 1), 1 x 4, dtype: bool
<140474855008224> 01000100

Ich habe versucht, die Linien zu kombinieren. Das Speicherlayout hat sich drastisch geändert. Es gibt auch zwei IntBlocks. Dies führt zu einer Fragmentierung. Ich möchte, dass Sie es zum richtigen Zeitpunkt zusammenstellen.

df4 = df3._consolidate()
(4509301552) BoolBlock: slice(3, 4, 1), 1 x 4, dtype: bool
<140474855008224> 01000100

(4509301648) FloatBlock: slice(1, 2, 1), 1 x 4, dtype: float64
<140474585317312> 0000000000000840000000000000104000000000000008400000000000001040

(4886728240) IntBlock: slice(0, 4, 2), 2 x 4, dtype: int64
<140475125920528> 01000000000000000200000000000000010000000000000002000000000000000500000000000000060000000000000005000000000000000600000000000000

Als ich die private Methode "_consolidate ()" aufrief, wurden die Int-Werte zusammengefasst und an der neuen Speicheradresse abgelegt.

Recommended Posts

So ermitteln Sie die Speicheradresse des Pandas-Datenrahmenwerts
So ermitteln Sie den Skalierungskoeffizienten eines bipolaren Wavelets
So überprüfen Sie die Speichergröße einer Variablen in Python
So überprüfen Sie die Speichergröße eines Wörterbuchs in Python
[Linux] [C / C ++] So ermitteln Sie den Wert der Rücksprungadresse einer Funktion und den Funktionsnamen des Aufrufers
So finden Sie heraus, ob "irgendwo" von pandas DataFrame einen Wert enthält
So berechnen Sie die Volatilität einer Marke
[Circuit x Python] So ermitteln Sie die Übertragungsfunktion eines Schaltkreises mit Lcapy
[Ubuntu] So löschen Sie den gesamten Inhalt des Verzeichnisses
So finden Sie die optimale Anzahl von Clustern für k-means
Erben Sie die Standardbibliothek, um den Durchschnittswert der Warteschlange zu ermitteln
Suchen Sie den Index des Maximalwerts (Minimalwerts) eines mehrdimensionalen Arrays
Kombinieren Sie Listen zu einem DataFrame mit Pandas
So erhalten Sie den letzten (letzten) Wert in einer Liste in Python
So verbinden Sie den Inhalt der Liste mit einer Zeichenfolge
Finden Sie die Definition des Wertes von errno
So ermitteln Sie die durchschnittliche Informationsmenge (Entropie) der ursprünglichen Wahrscheinlichkeitsverteilung aus der Stichprobe
Finden Sie den optimalen Wert der Funktion mit einem genetischen Algorithmus (Teil 2)
python / pandas / dataframe / So erhalten Sie die einfachste Zeile / Spalte / Index / Spalte
[Python] So fügen Sie einer Tabelle Zeilen und Spalten hinzu (pandas DataFrame)
So geben Sie das Ausgabeergebnis des Linux-Befehls man in eine Datei aus
So ermitteln Sie die Scheitelpunktkoordinaten eines Features in ArcPy
[NNabla] So entfernen Sie die mittlere Ebene eines vorgefertigten Netzwerks
[Python] Eine einfache Funktion zum Ermitteln der Mittelkoordinaten eines Kreises
[Python] Zusammenfassung der Verwendung von Pandas
So weisen Sie den Index im Pandas-Datenrahmen neu zu
[Pandas] Erweitern Sie die Zeichenfolgen zu DataFrame
[Pandas_flavor] Fügen Sie eine Methode von Pandas DataFrame hinzu
[Python] Was ist ein formales Argument? So stellen Sie den Anfangswert ein
So erhalten Sie mit pandas DataFrame einen bestimmten Spaltennamen und Indexnamen
So ermitteln Sie die Anzahl der CPUs ohne den Befehl sar
[Einführung in Python] So sortieren Sie den Inhalt einer Liste effizient mit Listensortierung
Ein Memorandum darüber, wie man Pandas schreibt, das ich persönlich oft vergesse
[NNabla] Hinzufügen einer Quantisierungsschicht zur mittleren Schicht eines trainierten Modells
So setzen Sie eine Zeilennummer am Anfang einer CSV-Datei
[Python] Lesen der CSV-Datei (Methode read_csv des Pandas-Moduls)
So finden Sie eine Spalte eines bestimmten Typs (str, float usw.) aus einer Spalte in einem DataFrame
So erstellen Sie einen Wrapper, der die Signatur der zu umschließenden Funktion beibehält
Ermitteln Sie den Mindestwert der Funktion mithilfe der Partikelgruppenoptimierungsmethode (PSO).
Ich habe versucht, den Höhenwert von DTM in einem Diagramm anzuzeigen
So spielen Sie ein Video ab, während Sie die Anzahl der Bilder ansehen (Mac)
Die Hand von "Millijan" durch Kombinationsoptimierung finden
Finden Sie die Anzahl der Tage in einem Monat
Finden Sie den Bruchteil des in Python eingegebenen Werts heraus
So finden Sie die Korrelation für kategoriale Variablen
So übergeben Sie das Ergebnis der Ausführung eines Shell-Befehls in einer Liste in Python
Wie man eine Benutzergruppe mit Slack-Benachrichtigung erwähnt, wie man die ID einer Benutzergruppe überprüft
Die Geschichte der IPv6-Adresse, die ich auf ein Minimum beschränken möchte
Ein Programmieranfänger versuchte, die Ausführungszeit des Sortierens usw. zu überprüfen.
Finden Sie heraus, wie Sie eine Datei mit einer bestimmten Anzahl von Zeilen gleichmäßig teilen können
So geben Sie mit Jupyter Notebook einen Wert in der Mitte einer Zelle aus
[NNabla] So erhalten Sie die Ausgabe (Variable) der mittleren Schicht des erstellten Netzwerks
[Wissenschaftlich-technische Berechnung von Python] Numerische Berechnung zur Ermittlung des Ableitungswerts (Differential)
[Python] So sortieren Sie nach dem N-ten M-ten Element eines mehrdimensionalen Arrays
Ein Memorandum zur Ausführung des Befehls! Sudo magic in Jupyter Notebook
[Numpy, scipy] Wie berechnet man die Quadratwurzel einer Elmeet-Matrix mit halbregelmäßigem Wert?
So ermitteln Sie den Koeffizienten der ungefähren Kurve, die in Python durch die Scheitelpunkte verläuft