Prüfen, ob der Datenrahmen in Pandas kopiert oder angezeigt wird

Gibt es eine einfache Möglichkeit, zu überprüfen, ob zwei Datenrahmen unterschiedliche Kopien oder Ansichten der gleichen zugrunde liegenden Daten sind, die keine Manipulationen beinhalten? Ich versuche, einen Griff zu bekommen, wenn jeder erzeugt wird, und gegeben, wie idiosynkratisch die Regeln zu sein scheinen, ich möchte eine einfache Möglichkeit zu testen.

Zum Beispiel dachte ich, dass "id (df.values)" über die Ansichten stabil wäre, aber sie scheinen nicht zu sein:

# Make two data frames that are views of same data. df = pd.DataFrame([[1,2,3,4],[5,6,7,8]], index = ['row1','row2'], columns = ['a','b','c','d']) df2 = df.iloc[0:2,:] # Demonstrate they are views: df.iloc[0,0] = 99 df2.iloc[0,0] Out[70]: 99 # Now try and compare the id on values attribute # Different despite being views! id(df.values) Out[71]: 4753564496 id(df2.values) Out[72]: 4753603728 # And we can of course compare df and df2 df is df2 Out[73]: False 

Andere Antworten Ich habe aufgeschaut, die versuchen, Regeln zu geben, aber scheinen nicht konsistent, und auch nicht beantworten diese Frage, wie zu testen:

  • Welche Regeln verwendet Pandas, um eine Ansicht zu einer Kopie zu erzeugen?

  • Pandas: Subindexing dataframes: Kopiert vs Ansichten

  • Verständnis der Pandas-Datenblatt-Indizierung

  • Re-assignment in Pandas: Kopieren oder Anzeigen?

Und natürlich: – http://pandas.pydata.org/pandas-docs/stable/indexing.html#returning-a-view-versus-a-copy

UPDATE: Die folgenden Kommentare scheinen die Frage zu beantworten – mit Blick auf das Attribut df.values und nicht auf das Attribut df.values , so handelt es sich um einen Verweis auf das Attribut df._is_copy (obwohl letzteres wohl sehr schlecht ist, da es ist Eine interne).

2 Solutions collect form web for “Prüfen, ob der Datenrahmen in Pandas kopiert oder angezeigt wird”

Antworten von HYRY und Marius in Kommentare!

Man kann entweder durch:

  • Test Äquivalenz der values.base Attribut anstatt der values Attribut, wie in:

    df.values.base is df2.values.base anstelle von df.values is df2.values .

  • Oder mit dem (zugegebenen internen) _is_view Attribut ( df2._is_view is True ).

Danke allen!

Sie können den Speicher verfolgen, den Ihre Pandas / Pythonumgebung verbraucht, und unter der Annahme, dass eine Kopie mehr Speicher als eine Ansicht nutzen wird, in der Lage sein, eine oder andere Weise zu entscheiden.

Ich glaube, es gibt Bibliotheken da draußen, die den Speicherverbrauch innerhalb der Pythonumgebung selbst präsentieren werden – zB Heapy / Guppy.

Es sollte eine Metrik sein, die Sie anwenden können, die ein Grundlinienbild des Gedächtnisgebrauchs nimmt, bevor das Objekt unter Inspektion erstellt wird, dann ein anderes Bild danach. Vergleich der beiden Speicherkarten (vorausgesetzt, dass nichts anderes entstanden ist und wir die Veränderung durch das neue Objekt isolieren können) sollte eine Vorstellung davon geben, ob eine Ansicht oder Kopie erstellt wurde.

Wir müssten eine Vorstellung von den verschiedenen Speicherprofilen jeder Art von Implementierung bekommen, aber einige Experimente sollten Ergebnisse liefern.

  • Normalisieren zwischen 0 und 1 ignorieren NaN
  • Pandas rolling.mean gibt unerwartete Werte zurück
  • Zählen von Wertänderungen in jeder Spalte in einem Datenrahmen in Pandas, die NaN-Änderungen ignorieren
  • Python-Pandas replizieren Zeilen in Dataframe
  • Mehrere Histogramme in Pandas
  • Pandas Dataframe: Sammeln Sie Elemente in Reichweite basierend auf ihren Geo-Koordinaten (Länge und Breite)
  • Wie man ein Dataframe in Pandas gruppiert und Spalten hält
  • Verbessern Sie auf landende Lambdas in Python (Pandas)
  • Texttabelle in pandas dataframe umwandeln
  • Python Pandas global vs übergeben Variable
  • Pandas-Fehler - ungültiger Wert angetroffen
  • Python ist die beste Programmiersprache der Welt.