python - पंडों को अभी भी.Woc का उपयोग करने के बाद भी SettingWithCopyWarning मिल रही है




pandas chained-assignment (2)

नोट: पांडा संस्करण 0.24 के रूप में, is_copy को हटा दिया गया है और भविष्य के संस्करण में हटा दिया जाएगा। जबकि निजी विशेषता _is_copy मौजूद है, अंडरस्कोर इंगित करता है कि यह विशेषता सार्वजनिक API का हिस्सा नहीं है और इसलिए उस पर निर्भर नहीं होना चाहिए। इसलिए, आगे बढ़ते हुए, यह SettingWithCopyWarning को शांत करने का एकमात्र उचित तरीका लगता है। विश्व स्तर पर ऐसा करना होगा:

pd.options.mode.chained_assignment = None

जब complete = train.dropna() निष्पादित हो जाता है, तो dropna एक प्रति वापस कर सकता है, इसलिए सावधानी से बहुतायत से बाहर, पंडों ने complete.is_copy सेट किया। एक सचाई मूल्य के लिए।

In [220]: complete.is_copy
Out[220]: <weakref at 0x7f7f0b295b38; to 'DataFrame' at 0x7f7eee6fe668>

यह पंडों को बाद में आपको चेतावनी देने की अनुमति देता है, जब complete['AgeGt15'] = complete['Age'] > 15 निष्पादित किया जाता है कि आप एक प्रति को संशोधित कर सकते हैं जिसका train पर कोई प्रभाव नहीं होगा। शुरुआती लोगों के लिए यह एक उपयोगी चेतावनी हो सकती है। आपके मामले में, ऐसा प्रतीत होता है कि आपका train अप्रत्यक्ष रूप से complete रूप से संशोधित करने का कोई इरादा नहीं है। इसलिए चेतावनी आपके मामले में सिर्फ एक व्यर्थ गुस्सा है।

आप सेटिंग करके चेतावनी को शांत कर सकते हैं,

complete.is_copy = False       # deprecated as of version 0.24

यह एक वास्तविक प्रतिलिपि बनाने की तुलना में तेज़ है, और कली में SettingWithCopyWarning को इंगित करता है (उस बिंदु पर जहां _check_setitem_copy कहा जाता है ):

def _check_setitem_copy(self, stacklevel=4, t='setting', force=False):
    if force or self.is_copy:
        ...

यदि आप वास्तव में आश्वस्त हैं कि आप जानते हैं कि आप क्या कर रहे हैं, तो आप विश्व स्तर पर SettingWithCopyWarning को बंद कर सकते हैं

pd.options.mode.chained_assignment = None # None|'warn'|'raise'

चेतावनी को चुप करने का एक वैकल्पिक तरीका एक नई प्रतिलिपि बनाना है:

complete = complete.copy()

हालाँकि, आप ऐसा नहीं करना चाह सकते हैं यदि DataFrame बड़ा है, क्योंकि कॉपी करने में एक महत्वपूर्ण मात्रा और समय लग सकता है, और यह पूरी तरह से व्यर्थ है ( चेतावनी को चुप कराने के लिए छोड़कर) यदि आप जानते हैं कि complete पहले से ही एक प्रतिलिपि है। ।

सबसे पहले, मैंने कुछ कोड लिखने की कोशिश की जो इस तरह दिखे:

import numpy as np
import pandas as pd
np.random.seed(2016)
train = pd.DataFrame(np.random.choice([np.nan, 1, 2], size=(10, 3)), 
                     columns=['Age', 'SibSp', 'Parch'])

complete = train.dropna()    
complete['AgeGt15'] = complete['Age'] > 15

SettingWithCopyWarning प्राप्त करने के बाद, मैंने प्रयोग करने की कोशिश की।

complete.loc[:, 'AgeGt15'] = complete['Age'] > 15
complete.loc[:, 'WithFamily'] = complete['SibSp'] + complete['Parch'] > 0

हालाँकि, मुझे अभी भी वही चेतावनी मिलती है। क्या देता है?


मैं इसे डेटाफ्रेम की प्रतिलिपि बनाकर हल करता हूं:

complete = train.copy()




chained-assignment