प्राथमिक उद्देश्य जंजीर अनुक्रमण से बचने और समाप्त करने के लिए है SettingWithCopyWarning।
यहाँ जंजीर अनुक्रमण कुछ इस तरह है dfc['A'][0] = 111
दस्तावेज़ में कहा गया है कि एक प्रति बनाम दृश्य में रिटर्निंग में जंजीर अनुक्रमण को टाला जाना चाहिए । यहाँ उस दस्तावेज़ से थोड़ा संशोधित उदाहरण दिया गया है:
In [1]: import pandas as pd
In [2]: dfc = pd.DataFrame({'A':['aaa','bbb','ccc'],'B':[1,2,3]})
In [3]: dfc
Out[3]:
A B
0 aaa 1
1 bbb 2
2 ccc 3
In [4]: aColumn = dfc['A']
In [5]: aColumn[0] = 111
SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame
In [6]: dfc
Out[6]:
A B
0 111 1
1 bbb 2
2 ccc 3
यहाँ aColumnएक दृश्य है और मूल DataFrame से प्रतिलिपि नहीं है, इसलिए संशोधित करने aColumnसे मूल dfcभी संशोधित हो जाएगा। अगला, यदि हम पंक्ति को पहले अनुक्रमित करते हैं:
In [7]: zero_row = dfc.loc[0]
In [8]: zero_row['A'] = 222
SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame
In [9]: dfc
Out[9]:
A B
0 111 1
1 bbb 2
2 ccc 3
यह समय zero_rowएक प्रति है, इसलिए मूल dfcको संशोधित नहीं किया गया है।
उपरोक्त इन दो उदाहरणों से, हम देखते हैं कि यह अस्पष्ट है कि आप मूल DataFrame को बदलना चाहते हैं या नहीं। यह विशेष रूप से खतरनाक है यदि आप निम्नलिखित जैसा कुछ लिखते हैं:
In [10]: dfc.loc[0]['A'] = 333
SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame
In [11]: dfc
Out[11]:
A B
0 111 1
1 bbb 2
2 ccc 3
इस बार यह बिल्कुल काम नहीं किया। यहां हम बदलना चाहते थे dfc, लेकिन हमने वास्तव में एक मध्यवर्ती मूल्य को संशोधित किया है जो dfc.loc[0]एक प्रति है और तुरंत खारिज कर दिया जाता है। यह अनुमान लगाना बहुत कठिन है कि इंटरमीडिएट वैल्यू पसंद है dfc.loc[0]या dfc['A']कोई व्यू है या कॉपी है, इसलिए इसकी गारंटी नहीं है कि ओरिजिनल डेटाफ़्रेम को अपडेट किया जाएगा या नहीं। इसलिए जंजीर अनुक्रमण से बचा जाना चाहिए, और SettingWithCopyWarningइस तरह के जंजीर अनुक्रमण अद्यतन के लिए पांडा उत्पन्न करता है ।
अब का उपयोग है .copy()। चेतावनी को खत्म करने के लिए, अपने इरादे को स्पष्ट रूप से व्यक्त करने के लिए एक प्रति बनाएँ:
In [12]: zero_row_copy = dfc.loc[0].copy()
In [13]: zero_row_copy['A'] = 444 # This time no warning
चूंकि आप एक प्रति संशोधित कर रहे हैं, आप जानते हैं कि मूल dfcकभी नहीं बदलेगा और आप इसे बदलने की उम्मीद नहीं कर रहे हैं। आपकी अपेक्षा व्यवहार से मेल खाती है, फिर SettingWithCopyWarningगायब हो जाती है।
ध्यान दें, यदि आप मूल DataFrame को संशोधित करना चाहते हैं, तो दस्तावेज़ आपको सुझाता है loc:
In [14]: dfc.loc[0,'A'] = 555
In [15]: dfc
Out[15]:
A B
0 555 1
1 bbb 2
2 ccc 3