Sprawdzanie czy ramka danych jest kopiowana czy wyświetlana w pandach

Czy istnieje łatwy sposób sprawdzenia, czy dwie ramki danych są różnymi kopiami lub widokami tych samych danych, które nie wymagają manipulacji? Staram się ogarnąć, kiedy każdy jest generowany, i biorąc pod uwagę, jak idiosynkratyczne zasady wydają się być, chciałbym łatwy sposób, aby przetestować.

Na przykład pomyślałem " id (df.wartości) " byłyby stabilne w różnych widokach, ale nie wydają się być:

# 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

Inne odpowiedzi, które sprawdziłem, które starają się podać zasady, ale nie wydają się spójne i również nie odpowiadaj na to pytanie Jak testować:

I oczywiście: - http://pandas.pydata.org/pandas-docs/stable/indexing.html#returning-a-view-versus-a-copy

Aktualizacja: komentarze poniżej wydają się odpowiadać na pytanie-patrząc na atrybut df.values.base zamiast df.values atrybut to robi, podobnie jak odniesienie do atrybutu df._is_copy (chociaż ten ostatni jest prawdopodobnie bardzo złą formą, ponieważ jest wewnętrzny).

Author: Brad Solomon, 2014-11-12

2 answers

Odpowiedzi HYRY i Mariusa w komentarzach!

Można sprawdzić przez:

  • Sprawdzanie równoważności atrybutu values.base zamiast atrybutu values, Jak w:

    df.values.base is df2.values.base zamiast df.values is df2.values.

  • lub używając (co prawda wewnętrznego) _is_view atrybutu (df2._is_view jest True).

Dziękuję wszystkim!

 13
Author: nick_eu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-18 20:37:32

Możesz prześledzić pamięć, którą twoje środowisko pandas/python zużywa i zakładając, że kopia będzie zużywać więcej pamięci niż widok, będziesz w stanie zdecydować w ten czy inny sposób.

Wierzę, że istnieją biblioteki, które przedstawią wykorzystanie pamięci w samym środowisku Pythona - np. Heopy / Guppy.

Powinien istnieć metryka, którą można zastosować, która robi obraz bazowy zużycia pamięci przed utworzeniem obiektu pod kontrolą, a następnie inny zdjęcie potem. Porównanie dwóch map pamięci (zakładając, że nic innego nie zostało utworzone i możemy wyizolować zmianę z powodu nowego obiektu) powinno dać wyobrażenie o tym, czy powstał Widok czy kopia.

Musielibyśmy poznać różne profile pamięci każdego typu implementacji, ale niektóre eksperymenty powinny przynieść rezultaty.

 0
Author: Thomas Kimber,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-12 16:51:31