2013-07-31 33 views
15

vs kopyalar Bir dataframePandalar: Subindexing dataframes: bu unsurların bir kopyasını</p> <pre><code>bar = foo.iloc[3:5,1:4] </code></pre> <p><code>bar</code> yapar tutun: görünümleri

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

var ve benim verilerin bir alt kümesinden başka dataframe oluşturmak Say foo? Bunun yerine view veri oluşturmak için herhangi bir yolu var mı? Eğer öyleyse, bu görünümdeki verileri değiştirmeye çalışırsam ne olur? Pandalar herhangi bir copy-on-write mekanizması sağlıyor mu? Sizin cevabınız pandalar docs: returning-a-view-versus-a-copy:

+0

yüzden [:, [ 'a', 'b']] bir kopyasını döndürür, ancak bar.loc yaptığımda bar.loc yaptığımda [:, 'a'] bir görünüm döndürür? – Lisa

cevap

21

. etiketlerin bir dizi ya da bir boolean vektör indeksleme operasyonda katılmaktadırlar zaman

, sonuç bir kopyası olacaktır. Tek etiketli/skaler indeksleme ve dilimleme ile, , ör. df.ix [3: 6] veya df.ix [:, 'A'], bir görünüm döndürecektir. Örnekte

, barfoo dilimlerini bir görünümü olduğunu. kopya numaralı belgeyi istiyorsanız, copy yöntemini kullanmış olabilirsiniz. bar değiştirilerek de foo değiştirilir. pandalar, bir yazma üzerine yazma mekanizmasına sahip değildir.

göstermek için aşağıda benim kod örneğe bakın:

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

böylece bar.loc [:, ['a', 'b']] yaptığımda bir kopya döndürür, ancak bar.loc [:, 'a'] yaptığımda bir görünüm döndürür? – Lisa

+0

bar.loc [:, 'a'], bir görüntüyü döndüren bir dilim gibi davranır; bir kopyasını döndüren liste dizinlemesi kullanan bar.loc [:, ['a', 'b']]. Bar.loc [:, ['a']] 'nın da bir kopyasını iade edeceğini unutmayın. – davidshinn

+0

bar ['a'] hakkında ne dersiniz? bir görünüm mü yoksa kopya mı? – Lisa

İlgili konular