2017-07-03 18 views
14

मैंने इस कोड को किसी की iPython नोटबुक में देखा, और मैं इस कोड को कैसे काम करता हूं इस बारे में बहुत उलझन में हूं।पायथन में .loc के साथ चयन

df.loc[index,column_name] 

हालांकि, इस मामले में, पहले सूचकांक बूलियन मूल्यों की एक श्रृंखला हो रहा है: जहाँ तक मैं समझ गया, pd.loc [] एक स्थान आधारित इंडेक्सर जहां स्वरूप है के रूप में प्रयोग किया जाता है। क्या कोई मुझे बता सकता है कि यह चयन कैसे काम करता है। मैंने प्रलेखन के माध्यम से पढ़ने की कोशिश की लेकिन मुझे स्पष्टीकरण नहीं मिला। धन्यवाद!

iris_data.loc[iris_data['class'] == 'versicolor', 'class'] = 'Iris-versicolor' 

enter image description here

उत्तर

1

यह pandas पैकेज से dataframes उपयोग कर रहा है। "इंडेक्स" भाग या तो एक सूचकांक, सूचकांक की एक सूची, या बूलियन की एक सूची हो सकती है। इस दस्तावेज में के बारे में पढ़ा जा सकता है: https://pandas.pydata.org/pandas-docs/stable/indexing.html

तो index हिस्सा पंक्तियों का एक सबसेट निर्दिष्ट करता है बाहर निकलने के लिए, और (वैकल्पिक) column_name स्तंभ आप dataframe की कि उपसमूह से साथ काम करना चाहते निर्दिष्ट करता है।

iris_data.loc[iris_data['class'] == 'versicolor', 'class'] = 'Iris-versicolor' 
0

यह pandas लेबल आधारित है: यदि आप 'क्लास' स्तंभ को अद्यतन करने, लेकिन केवल पंक्तियों जहां वर्ग वर्तमान में 'वर्सिकलर' के रूप में सेट किया गया है में चाहते हैं, आप क्या आप प्रश्न में सूची की तरह कुछ कर सकता तो चयन, जैसा कि यहां बताया गया है: https://pandas.pydata.org/pandas-docs/stable/indexing.html#selection-by-label

बूलियन सरणी मूल रूप से मास्क का उपयोग करके एक चयन विधि है।

25

pd.DataFrame.loc एक या दो इंडेक्सर्स ले सकते हैं। बाकी पोस्ट के लिए, मैं पहले इंडेक्सर को i और दूसरा इंडेक्सर j के रूप में प्रस्तुत करूंगा।

यदि केवल एक अनुक्रमणिका प्रदान की जाती है, तो यह डेटाफ्रेम की अनुक्रमणिका पर लागू होती है और गायब सूचकांक को सभी कॉलम का प्रतिनिधित्व करने के लिए माना जाता है। तो निम्नलिखित दो उदाहरण बराबर हैं।

  1. df.loc[i]
  2. df.loc[i, :]

कहाँ : सभी स्तंभों का प्रतिनिधित्व करने के लिए किया जाता है।

यदि दोनों सूचकांक मौजूद हैं, i संदर्भ सूचकांक मान और j संदर्भ कॉलम मान।


अब हम मान i और j के प्रकार क्या यह मान सकते हैं पर ध्यान केंद्रित कर सकते हैं।

df = pd.DataFrame([[1, 2], [3, 4]], index=['A', 'B'], columns=['X', 'Y']) 

loc में लिखा गया है कि इस तरह के i और j

  1. scalars कि संबंधित सूचकांक में मान होना चाहिए हो सकता है वस्तुओं

    : चलो हमारे उदाहरण के रूप में dataframe df निम्नलिखित का उपयोग करते हैं
    df.loc['A', 'Y'] 
    
    2 
    
  2. सरणियों जिसका तत्वों को भी संबंधित सूचकांक वस्तु के सदस्य हैं (ध्यान दें कि मैं loc को पारित सरणी के आदेश का सम्मान है

    df.loc[['B', 'A'], 'X'] 
    
    B 3 
    A 1 
    Name: X, dtype: int64 
    
    • सूचना वापसी वस्तु की आयामी स्वरूप जब सरणियों गुजर। i एक सरणी है जैसा ऊपर था, loc एक ऑब्जेक्ट देता है जिसमें उन मानों के साथ एक अनुक्रमणिका लौटा दी जाती है। इस मामले में, क्योंकि j एक स्केलर था, locpd.Series ऑब्जेक्ट लौटा। अगर हम i और j के लिए एक सरणी पारित करते हैं, तो हम डेटाफ्रेम वापस करने के लिए इसका उपयोग कर सकते थे, और सरणी केवल एक मानी गई सरणी हो सकती थी।

      df.loc[['B', 'A'], ['X']] 
      
          X 
      B 3 
      A 1 
      
  3. बूलियन सरणियों जिसका तत्वों True या False कर रहे हैं और जिसकी लंबाई संबंधित सूचकांक की लंबाई से मेल खाता है। इस मामले में, loc बस पंक्तियों (या कॉलम) को पकड़ता है जिसमें बूलियन सरणी True है।

    df.loc[[True, False], ['X']] 
    
        X 
    A 1 
    

क्या Indexers आप loc को पारित कर सकते हैं के अलावा, यह भी आप कार्य बनाने के लिए सक्षम बनाता है। अब हम आपके द्वारा प्रदान किए गए कोड की रेखा को तोड़ सकते हैं।

iris_data.loc[iris_data['class'] == 'versicolor', 'class'] = 'Iris-versicolor' 
  1. iris_data['class'] == 'versicolor' एक बूलियन सरणी देता है।
  2. class एक स्केलर है जो कॉलम ऑब्जेक्ट में मान का प्रतिनिधित्व करता है।
  3. iris_data.loc[iris_data['class'] == 'versicolor', 'class'] रिटर्न सभी पंक्तियों के लिए 'class' स्तंभ जब एक असाइनमेंट ऑपरेटर के साथ प्रयोग किया जहां 'class''versicolor'
  4. है से मिलकर pd.Series वस्तु:

    iris_data.loc[iris_data['class'] == 'versicolor', 'class'] = 'Iris-versicolor' 
    

    हम स्तंभ 'class' जहां 'class' था में सभी तत्वों के लिए 'Iris-versicolor' आवंटित 'versicolor'

1

यह एक पांडा डेटा-फ्रेम है और यह डीएफ के साथ लेबल बेस चयन टूल का उपयोग कर रहा है।स्थानीय और इसमें, दो इनपुट हैं, पंक्ति के लिए एक और स्तंभ के लिए दूसरा, इसलिए पंक्ति इनपुट में यह उन सभी पंक्ति मानों का चयन कर रहा है जहां कॉलम 'वर्ग' में सहेजा गया मान 'versicolor' है, और कॉलम इनपुट यह लेबल 'क्लास' के साथ कॉलम का चयन कर रहा है, और उन्हें 'आईरिस-वर्सीकलर' मान असाइन कर रहा है। तो मूल रूप से यह 'आईरिस-वर्सीकलर' के साथ मूल्य 'बनाम' के साथ कॉलम 'कक्षा' की सभी कोशिकाओं को प्रतिस्थापित कर रहा है।

संबंधित मुद्दे