it-swarm.com.de

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

Gibt es eine einfache Möglichkeit zu überprüfen, ob zwei Datenframes unterschiedliche Kopien oder Ansichten derselben zugrunde liegenden Daten sind, die keine Manipulationen erfordern? Ich versuche zu verstehen, wann jeder erzeugt wird, und angesichts der Eigenartigkeit der Regeln scheint es mir eine einfache Möglichkeit zu geben, zu testen. 

Ich dachte zum Beispiel, dass "id (df.values)" in allen Ansichten stabil wäre, aber es scheint nicht so 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 nachgeschlagen, um Regeln zu geben, die aber nicht einheitlich erscheinen und auch nicht die Frage beantworten, wie man sie testen kann:

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 dem df.values.base-Attribut und nicht mit dem df.values-Attribut wird dies getan, ebenso wie ein Verweis auf das df._is_copy-Attribut ).

26
nick_eu

Antworten von HYRY und Marius in Kommentaren! 

Man kann entweder überprüfen durch:

  • testen der Äquivalenz des values.base-Attributs anstelle des values-Attributs, wie in:

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

  • oder mit dem (zugegebenermaßen internen) _is_view-Attribut (df2._is_view ist True).

Vielen Dank an alle!

16
nick_eu

Sie können den Speicher aufspüren, den Ihre Pandas/Python-Umgebung verbraucht, und unter der Annahme, dass eine Kopie mehr Speicher als eine Ansicht beansprucht, können Sie auf die eine oder andere Weise entscheiden. 

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

Es sollte eine Metrik geben, die Sie anwenden können, die vor dem Erstellen des zu inspizierenden Objekts ein Ausgangsbild der Speicherbelegung macht und anschließend ein anderes Bild. Ein Vergleich der beiden Speicherkarten (vorausgesetzt, es wurde nichts anderes erstellt und wir können die Änderung durch das neue Objekt isolieren) sollte eine Vorstellung davon liefern, ob eine Ansicht oder eine Kopie erstellt wurde.

Wir müssten eine Vorstellung von den verschiedenen Speicherprofilen der einzelnen Implementierungstypen bekommen, aber ein paar Experimente sollten zu Ergebnissen führen. 

0
Thomas Kimber