python - पांडों का उपयोग एक प्रति बनाम एक दृश्य उत्पन्न करने के लिए क्या नियम करता है?



pandas dataframe (1)

नियम यहां दिए गए हैं, बाद में ओवरराइड करें:

  • सभी परिचालन एक प्रति उत्पन्न करते हैं

  • यदि inplace=True प्रदान किया जाता है, तो यह जगह में संशोधित होगा; केवल कुछ ऑपरेशन इसका समर्थन करते हैं

  • एक इंडेक्सर जो सेट करता है, उदाहरण के लिए .loc/.ix/.iloc/.iat/.at सेट करेगा।

  • एक इंडेक्सर जो सिंगल-डाइप्ड ऑब्जेक्ट पर आता है लगभग हमेशा एक दृश्य होता है (मेमोरी लेआउट के आधार पर ऐसा नहीं हो सकता है कि यह विश्वसनीय नहीं है)। यह मुख्य रूप से दक्षता के लिए है। (ऊपर से उदाहरण .query ; यह हमेशा एक प्रतिलिपि के रूप में मूल्यांकन करेगा क्योंकि यह numexpr द्वारा मूल्यांकन किया numexpr )

  • एक इंडेक्सर जो एक बहु-डाइट ऑब्जेक्ट पर आता है हमेशा एक प्रति है।

chained indexing का आपका उदाहरण

df[df.C <= df.B].ix[:,'B':'E']

काम करने की गारंटी नहीं है (और इस प्रकार आप इसे कभी नहीं करते हैं)।

इसके बजाए:

df.ix[df.C <= df.B, 'B':'E']

क्योंकि यह तेज़ है और हमेशा काम करेगा

जंजीर इंडेक्सिंग 2 अलग पायथन परिचालन है और इस प्रकार पांडा द्वारा विश्वसनीय रूप से अवरुद्ध नहीं किया जा सकता है (आप अक्सर एक SettingWithCopyWarning प्राप्त करेंगे, लेकिन यह 100% पता लगाने योग्य नहीं है)। देव डॉक्स , जो आपने इंगित किया है, एक और अधिक पूर्ण स्पष्टीकरण प्रदान करते हैं।

मैं नियमों के बारे में उलझन में हूं कि पांडु का उपयोग करते समय यह तय करते समय कि डेटाफ्रेम से चयन मूल डेटाफ्रेम की एक प्रति है, या मूल पर एक दृश्य है।

अगर मेरे पास है, उदाहरण के लिए,

df = pd.DataFrame(np.random.randn(8,8), columns=list('ABCDEFGH'), index=range(1,9))

मैं समझता हूं कि एक query एक प्रतिलिपि देता है ताकि कुछ ऐसा हो

foo = df.query('2 < index <= 5')
foo.loc[:,'E'] = 40

मूल डेटाफ्रेम, df पर कोई प्रभाव नहीं पड़ेगा। मैं यह भी समझता हूं कि स्केलर या नामित स्लाइस एक दृश्य लौटते हैं, ताकि इनके लिए असाइनमेंट, जैसे कि

df.iloc[3] = 70

या

df.ix[1,'B':'E'] = 222

df बदल जाएगा। लेकिन जब मैं अधिक जटिल मामलों की बात करता हूं तो मैं खो जाता हूं। उदाहरण के लिए,

df[df.C <= df.B]  = 7654321

df बदलता है, लेकिन

df[df.C <= df.B].ix[:,'B':'E']

नहीं करता।

क्या कोई साधारण नियम है कि पांडस इसका उपयोग कर रहे हैं कि मैं अभी याद कर रहा हूं? इन विशिष्ट मामलों में क्या चल रहा है; और विशेष रूप से, मैं एक डेटाफ्रेम में सभी मानों (या मूल्यों का सबसेट) कैसे बदलूं जो किसी विशेष क्वेरी को पूरा करते हैं (जैसा कि मैं उपरोक्त अंतिम उदाहरण में करने का प्रयास कर रहा हूं)?

नोट: यह इस प्रश्न के समान नहीं है; और मैंने प्रलेखन पढ़ा है , लेकिन इसके द्वारा प्रबुद्ध नहीं किया गया है। मैंने इस विषय पर "संबंधित" प्रश्नों के माध्यम से भी पढ़ा है, लेकिन मुझे अभी भी सरल नियम पांडस का उपयोग कर रहा है, और मैं इसे कैसे लागू करूं - उदाहरण के लिए - मानों को संशोधित करें (या मूल्यों का सबसेट) एक डेटाफ्रेम में जो एक विशेष क्वेरी को संतुष्ट करता है।





chained-assignment