आपका उत्तर पांडा दस्तावेज़ों में स्थित है: 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
इसलिए जब मैं bar.loc करना [:, [ 'एक', 'बी']] यह एक प्रति देता है, लेकिन जब मैं bar.loc करना [:, 'ए'] यह एक दृश्य देता है? – Lisa