2013-07-31 3 views
15

बनाम मैं एक dataframeपांडा: Subindexing dataframes:</p> <pre><code>bar = foo.iloc[3:5,1:4] </code></pre> <p>करता <code>bar</code> उन तत्वों की एक प्रति दबाए रखें: प्रतियां विचारों

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

है और मैं अपने डेटा के एक उपसमूह से दूसरे dataframe बनाने कहो foo से? क्या इसके बजाय उस डेटा के view बनाने का कोई तरीका है? यदि हां, तो क्या होगा यदि मैं इस दृश्य में डेटा को संशोधित करने का प्रयास करता हूं? क्या पांडस copy-on-write तंत्र प्रदान करता है?

+0

इसलिए जब मैं bar.loc करना [:, [ 'एक', 'बी']] यह एक प्रति देता है, लेकिन जब मैं bar.loc करना [:, 'ए'] यह एक दृश्य देता है? – Lisa

उत्तर

21

आपका उत्तर पांडा दस्तावेज़ों में स्थित है: returning-a-view-versus-a-copy

जब भी लेबल की एक सरणी या एक बूलियन वेक्टर अनुक्रमण ऑपरेशन में शामिल कर रहे हैं, परिणाम एक प्रति हो जाएगा। एकल लेबल/स्केलर इंडेक्सिंग और स्लाइसिंग के साथ, उदा। df.ix [3: 6] या df.ix [:, 'ए'], एक दृश्य वापस किया जाएगा

अपने उदाहरण में, bar एक foo के स्लाइस की दृश्य है। यदि आप प्रति कॉपी करना चाहते थे, तो आप copy विधि का उपयोग कर सकते थे। bar संशोधित करने से foo भी संशोधित होता है। पांडा में कॉपी-ऑन-राइट तंत्र नहीं दिखता है।

वर्णन करने के लिए नीचे मेरी कोड उदाहरण देखें:

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

तो जब मैं bar.loc [:, ['a', 'b']] करता हूं तो यह एक प्रतिलिपि देता है, लेकिन जब मैं bar.loc [:, 'a'] करता हूं तो यह एक दृश्य देता है? – Lisa

+0

bar.loc [:, 'a'] एक टुकड़ा की तरह कार्य करता है, जो एक दृश्य देता है, बनाम bar.loc [:, ['a', 'b']], जो सूची अनुक्रमण का उपयोग करता है जो एक प्रतिलिपि देता है। ध्यान दें कि bar.loc [:, ['a']] एक प्रतिलिपि भी वापस करेगा। – davidshinn

+0

बार ['a'] के बारे में कैसे? क्या यह एक दृश्य या एक प्रति है? – Lisa

संबंधित मुद्दे