[PYTHON] Die Kopiermethode von pandas.DataFrame ist standardmäßig Deep Copy

Die Schlussfolgerung ist, wie der Titel sagt. Auch in der offiziellen Dokumentation geschrieben.

Ein Kollege sagte: "Die Zuweisungsmethode von Pandas erstellt intern eine Kopie des Datenrahmens. Dies ist langsam und problematisch, da Speicherplatz verbraucht wird."

Ich bin süchtig danach, "Eradikationsausschuss für die Verarbeitung von Python / Pandas zur rekursiven Zuweisung" zu lesen und einen statistischen Stapelprozess unter Verwendung einer Methodenkette zu schreiben. Ich tat.

Wenn Sie sich jedoch den [tatsächlichen Pandas-Code] ansehen (https://github.com/pandas-dev/pandas/blob/v0.20.3/pandas/core/frame.py#L2492),

#Kommentare und andere Methoden werden weggelassen
class DataFrame(NDFrame):

    def insert(self, loc, column, value, allow_duplicates=False):
        data = self.copy()

        # do all calculations first...
        results = {}
        for k, v in kwargs.items():
            results[k] = com._apply_if_callable(v, data)

        # ... and then assign
        for k, v in sorted(results.items()):
            data[k] = v

        return data

Ich dachte: "Oh? Pythons Kopiermethode ist flache Kopie in Wörterbüchern und Arrays?" Aber

Wenn Sie die Kopiermethode in einem Wörterbuch oder Array verwenden, sind die darin enthaltenen Objekte daher identisch, und das Kopieren der darin enthaltenen Objekte beansprucht den Speicher nicht.

a = {'a': [1, 2, 3]}
b = a.copy()

#Der Inhalt von a und b ist der gleiche
assert a['a'] is b['a']

#Zerstörerische Veränderungen gehen über!
a['a'].append(4)
print(b)
# => {'a': [1, 2, 3, 4]}

Die Kopiermethode von Pandas (und die Zuweisungsmethode, die sie verwendet) scheint besser zu sein, sich um den Speicher zu kümmern, wenn es um große Datenrahmen geht.

import pandas as pd

df_a = pd.DataFrame({'a': [1, 2, 3]})
df_b = df_a.copy()

#Der Inhalt von a und b ist nicht der gleiche!
assert df_a['a'] is not df_b['a']

Ein halber Witz, sagte ich meinem Kollegen, wenn dies Haskell wäre, wäre es kein Problem, da eine flache Kopie keine destruktiven Änderungen vornehmen würde.

Dies ist ein Kommentar eines Kollegen. Ich würde gerne wissen, ob es einen Schreibstil gibt, der sowohl leicht zu verstehen als auch Speicher spart.

[Vorsicht bei der Beseitigung der rekursiven Substitution von Pandas] Ich denke, dass es viele Fälle gibt, in denen Zuweisung und Pipe verwendet werden, um eine rekursive Zuweisung zu vermeiden. Beachten Sie jedoch, dass Zuweisung eine Kopie von df selbst ist, sodass sie viel langsamer ist. Auf der anderen Seite wird die Pipe nicht kopiert, also ist es okay

assign https://github.com/pandas-dev/pandas/blob/v0.20.3/pandas/core/frame.py#L2492 pipe https://github.com/pandas-dev/pandas/blob/v0.19.2/pandas/core/generic.py#L2698-L2708

Ich denke jedoch, dass es wahr ist, dass das Zuweisen als UI einfach zu lesen ist

  • Reduzieren Sie die Anzahl der Zuweisungen so weit wie möglich (es ist in Ordnung, mehrere Spalten mit einer Zuweisung hinzuzufügen, da keine Kopie erfolgt).
  • Schütteln und rekursiv ersetzen

Ich frage mich, ob ich es am besten kann ...

Übrigens habe ich die Spalten eingegrenzt, bevor ich sie an die Zuweisung übergeben habe, und versucht, den zurückgegebenen Datenrahmen in den ursprünglichen Datenrahmen zu konvertieren. Im Gegenteil, er war erheblich langsamer, sodass dies auch nicht sehr gut ist

Recommended Posts

Die Kopiermethode von pandas.DataFrame ist standardmäßig Deep Copy
Nach dem Bild des Shiba-Hundes zu urteilen, indem man tief lernt, ob es mein Kind ist (1)
cv2.Canny (): Macht die Anpassung der Kantenerkennung mit der Canny-Methode angenehm
Leider gibt es kein Gefühl der Einheit in der where-Methode
Ist die Niederschlagswahrscheinlichkeit korrekt?
Wissenschaft "Ist Saito der Vertreter von Saito?"
[Erkennung von Anomalien] Versuchen Sie es mit der neuesten Methode des Fernunterrichts
Finden Sie das Verhältnis der Fläche des Biwa-Sees nach der Monte-Carlo-Methode
Bestimmen, ob es mein Kind ist, anhand des Bildes eines Shiba-Hundes durch tiefes Lernen (3) Visualisierung durch Grad-CAM
Was ist die Newton-Methode? ?? Ungefähre Lösung der nach der Newton-Methode zu lösenden Gleichung
Sprachverarbeitung durch tiefes Lernen: Lassen Sie uns anhand der Stimme herausfinden, wer der Sprecher ist
Den Namen der Methode, die ihn aufgerufen hat, finden Sie in der Python-Methode
[Einführung in Python] Wie wird mit der continue-Anweisung wiederholt?
Zählen / überprüfen Sie die Anzahl der Methodenaufrufe.
Othello-Aus der dritten Zeile von "Implementation Deep Learning" (3)
Was ist die Ursache für den folgenden Fehler?
Visualisieren Sie die Auswirkungen von Deep Learning / Regularisierung
Pandas des Anfängers, vom Anfänger, für den Anfänger [Python]
Zusammenfassung der Verbindungsmethode nach DB von SQL Alchemy
Der hintere Schrägstrich der japanischen Tastatur ist "ro".
Othello-Aus der dritten Zeile von "Implementation Deep Learning" (2)
Machen Sie den Standardwert des Arguments unveränderlich
[pandas] Wenn Sie die Standardindexbezeichnung in der at-Methode angeben, ist "" nicht erforderlich
Ändern Sie in Python das Verhalten der Methode je nach Aufruf
Annäherung nach der Methode der kleinsten Quadrate eines Kreises mit zwei festen Punkten
Das Format der von der Slack-API erhaltenen Nachricht ist auf subtile Weise schwierig zu verwenden
Bestimmen Sie anhand des Bildes des Shiba-Hundes anhand des Bildes des Shiba-Hundes, ob es sich um ein Kind handelt
Sattelpunktsuche mit der Gradientenmethode
Die erste Markov-Ketten-Monte-Carlo-Methode von PyStan
Ich habe versucht, die Anzahl durch Programmieren zu erhöhen oder zu verringern
Die Kopiermethode von pandas.DataFrame ist standardmäßig Deep Copy
[Pyro] Statistische Modellierung mit der probabilistischen Programmiersprache Pyro ~ What is Pyro ~
Die Geschichte des tiefen Lernens mit TPU
Informationen zur Genauigkeit der Berechnungsmethode für das Umfangsverhältnis von Archimedes
Über das Verhalten von copy, deepcopy und numpy.copy
Sortieren Sie die Elemente eines Arrays, indem Sie Bedingungen angeben
Der Ursprung von Manjaro Linux ist "Mount Kirimanjaro"
Kopieren Sie die Liste in Python
FAQ: Warum ist der Zahlenvergleich inkonsistent?
Der Wert von pyTorch torch.var () wird nicht verteilt
Dies ist die einzige grundlegende Überprüfung von Python ~ 1 ~
Dies ist die einzige grundlegende Überprüfung von Python ~ 2 ~
Minimieren Sie die Anzahl der Polierungen, indem Sie die Kombination optimieren
Beurteilung des Endes von Mahjong durch Kombinationsoptimierung
Suchen Sie nach dem Wert der Instanz in der Liste
Dies ist die einzige grundlegende Überprüfung von Python ~ 3 ~
Tiefes Lernen durch Implementierung (Segmentierung) ~ Implementierung von SegNet ~
Rückgabewert von quit () - Gibt es etwas, das von der "Funktion, die alles beendet" zurückgegeben wird?
Verwendung zum Aufrufen einer Methode einer Instanz, bevor sie von __new__ zurückgegeben wird
Der Zeitpunkt, zu dem der Wert des Standardarguments ausgewertet wird, unterscheidet sich zwischen Ruby und Python.