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


118

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

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

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

मूल dataframe पर कोई प्रभाव नहीं पड़ेगा, 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']

नहीं करता।

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


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

जवाबों:


138

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

  • सभी ऑपरेशन एक प्रति उत्पन्न करते हैं

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

  • एक अनुक्रमणिका जो सेट करती है, उदा .loc/.iloc/.iat/.at

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

  • एक अनुक्रमणिका जो एक बहु-dtyped ऑब्जेक्ट पर मिलती है, हमेशा एक प्रति होती है।

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

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

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

इसके बजाय करें:

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

जैसा कि यह तेज़ है और हमेशा काम करेगा

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


3
.queryक्या ALWAYS इसकी वजह से एक प्रति वापस लौटाएगा (और एक दृश्य नहीं), क्योंकि इसका मूल्यांकन n numexpr द्वारा किया गया है। तो मैं इसे 'नियमों' में जोड़ दूंगा
जेफ

3
पांडा एक दृश्य उत्पन्न होता है या नहीं यह निर्धारित करने के लिए सुन्न पर निर्भर करता है। एक एकल dtype मामले में (जो श्रृंखला के लिए 1-d हो सकता है, फ्रेम के लिए 2-d, आदि)। सुन्न एक दृश्य उत्पन्न कर सकता है ; यह निर्भर करता है कि आप क्या कर रहे हैं; कभी-कभी आपको एक दृश्य मिल सकता है और कभी-कभी आप ऐसा नहीं कर सकते। पांडा इस तथ्य पर बिल्कुल भी भरोसा नहीं करते हैं क्योंकि यह हमेशा स्पष्ट नहीं है कि क्या कोई दृश्य उत्पन्न होता है। लेकिन यह बात मायने नहीं रखती है क्योंकि सेटिंग करते समय नियंत्रण रेखा इस पर निर्भर नहीं करती है। हालांकि, जब चेन इंडेक्सिंग बहुत महत्वपूर्ण है (और इस तरह चेन इंडेक्सिंग खराब क्यों है)
जेफ

3
बहुत धन्यवाद जेफ, आपका जवाब सबसे उपयोगी है। इस विषय पर आपका स्रोत / संदर्भ क्या है?
कामिक्सवे

4
तो पहले, अपने महान काम के लिए धन्यवाद! और दूसरा, यदि आपके पास पर्याप्त समय है तो मुझे लगता है कि डॉक्टर के मुख्य उत्तर के समान एक पैराग्राफ जोड़ना बहुत अच्छा होगा।
कामिक्सवे

2
डॉक्स को जोड़ने / संशोधित करने के लिए निश्चित रूप से एक पुल-अनुरोध ले जाएगा। इसके लिए जाओ।
जेफ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.