2013-07-31 11 views
15

Say mam dataframePandy: Subindexing dataframes: Kopie vs widokiem

import pandas as pd 
import numpy as np 
foo = pd.DataFrame(np.random.random((10,5))) 

i tworzę kolejny dataframe z podzbioru moich danych:

bar = foo.iloc[3:5,1:4] 

dokłada bar przechowywania kopii tych elementów od foo? Czy istnieje sposób, aby zamiast tego utworzyć view tych danych? Jeśli tak, co by się stało, gdy spróbuję zmodyfikować dane w tym widoku? Czy Pandy dostarczają jakiegokolwiek mechanizmu o numerze copy-on-write?

+0

więc kiedy robię bar.loc [:, [ 'a', 'b']] zwraca kopię, ale kiedy robię bar.loc [:, 'a'] zwraca widok? – Lisa

Odpowiedz

21

Twoja odpowiedź leży w dokumentach pandy: returning-a-view-versus-a-copy.

Ilekroć tablicą etykiet lub logiczna wektora są zaangażowane w operacji indeksowania, wynik będzie kopia. Indeksowanie pojedynczej etykiety/skalarne i krojenie, np. df.ix [3: 6] lub df.ix [:, "A"], widok zostanie zwrócony.

W przykładzie bar jest widok plasterki foo. Jeśli chcesz uzyskać kopię, możesz użyć metody copy. Modyfikowanie bar modyfikuje także foo. Wydaje się, że pandy nie mają mechanizmu kopiowania przy zapisie.

Zobacz mój przykład kodu poniżej, aby zilustrować:

In [1]: import pandas as pd 
    ...: import numpy as np 
    ...: foo = pd.DataFrame(np.random.random((10,5))) 
    ...: 

In [2]: pd.__version__ 
Out[2]: '0.12.0.dev-35312e4' 

In [3]: np.__version__ 
Out[3]: '1.7.1' 

In [4]: # DataFrame has copy method 
    ...: foo_copy = foo.copy() 

In [5]: bar = foo.iloc[3:5,1:4] 

In [6]: bar == foo.iloc[3:5,1:4] == foo_copy.iloc[3:5,1:4] 
Out[6]: 
     1  2  3 
3 True True True 
4 True True True 

In [7]: # Changing the view 
    ...: bar.ix[3,1] = 5 

In [8]: # View and DataFrame still equal 
    ...: bar == foo.iloc[3:5,1:4] 
Out[8]: 
     1  2  3 
3 True True True 
4 True True True 

In [9]: # It is now different from a copy of original 
    ...: bar == foo_copy.iloc[3:5,1:4] 
Out[9]: 
     1  2  3 
3 False True True 
4 True True True 
+0

, więc gdy robię bar.loc [:, ["a", "b"]] zwraca kopię, ale kiedy robię bar.loc [:, "a"] zwraca widok? – Lisa

+0

Pasek bar.loc [:, "a"] działa jak plaster, który zwraca widok, a bar.loc [:, ["a", "b"]], który używa indeksowania listy, które zwraca kopię. Zwróć uwagę, że bar.loc [:, ['a']] również zwróciłby kopię. – davidshinn

+0

co powiesz na pasek ["a"]? czy to jest widok czy kopia? – Lisa