2014-11-12 3 views
20

Gibt es eine einfache Möglichkeit zu überprüfen, ob zwei Datenrahmen unterschiedliche Kopien oder Ansichten derselben zugrunde liegenden Daten sind, die keine Manipulationen beinhalten? Ich versuche, sie in den Griff zu bekommen, wenn sie erzeugt werden, und angesichts der Eigenständigkeit der Regeln möchte ich eine einfache Testmöglichkeit haben.Überprüfen, ob der Datenrahmen in Pandas kopiert oder angezeigt wird

Zum Beispiel dachte ich, „id (df.values)“ würde über Ansichten stabil sein, 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, die ich habe, die zu geben versuchen aufblickte Regeln, aber scheint nicht im Einklang, und diese Frage nicht beantworten auch, wie man Test:

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

UPDATE: Kommentare unten scheint die Frage zu beantworten - Blick auf die df.values.base Attribut statt df.values Attribut tut es, wie auch eine Bezugnahme auf die df._is_copy Attribut (obwohl letzteres wahrscheinlich sehr schlechte Form ist, da es ein internes ist).

+1

Hmmm, 'df2._is_view' gibt' True' zurück, aber da es als privat/intern markiert ist, könnte es einen besseren Weg geben. – Marius

+1

Für Ihren Fall können Sie verwenden: 'df2.values.base ist df.values.base' – HYRY

+0

Im Allgemeinen wird' 'df.values'' eine Kopie erstellen, es sei denn, es ist ein einzelner dtype (da es rechenintensiv ist) . Warum interessiert es dich, wenn es eine Ansicht ist und was versuchst du eigentlich zu tun? – Jeff

Antwort

12

Antworten von HYRY und Marius in Kommentaren!

Man kann überprüfen, entweder durch:

  • Test Gleichwertigkeit des values.base Attribut anstatt das values Attribut, wie in:

    df.values.base is df2.values.base statt df.values is df2.values.

  • oder mit dem Attribut (intern) (df2._is_view ist True).

Danke allen!

+1

Was ist, wenn die Beziehung verschachtelt ist? Funktioniert das immer noch korrekt? Das heißt, wenn DF1 möglicherweise eine Ansicht ist, kann es sich möglicherweise um eine Kopie von DF2 handeln; und DF2 vielleicht eine Ansicht vielleicht eine Kopie von DF3? – max

+0

Was ist mit 'ID's? –

0

Sie können den Speicher Ihrer pandas/python-Umgebung verfolgen und unter der Annahme, dass eine Kopie mehr Speicher als eine Ansicht verwendet, in der Lage sein, auf die eine oder andere Weise zu entscheiden.

Ich glaube, es gibt Bibliotheken da draußen, die die Speichernutzung innerhalb der Python-Umgebung selbst darstellen - z. Heapy/Guppy.

Es sollte eine Metrik geben, die Sie anwenden können, die ein Grundlinienbild der Speichernutzung vor dem Erstellen des zu prüfenden Objekts annimmt, danach ein anderes Bild. Ein Vergleich der zwei Speicherkarten (vorausgesetzt, dass nichts anderes erzeugt wurde und wir können die Änderung aufgrund des neuen Objekts isolieren) sollte eine Vorstellung davon liefern, ob eine Ansicht oder eine Kopie erzeugt wurde.

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