2016-10-21 10 views
6

के रूप में स्ट्रिंग्स के टुपल के साथ पांडस डेटाफ्रेम मैं कुछ अजीब pandas व्यवहार को महसूस कर रहा हूं। मैं एक dataframe तरहइंडेक्स

df = pd.DataFrame(columns=['Col 1', 'Col 2', 'Col 3'], 
        index=[('1', 'a'), ('2', 'a'), ('1', 'b'), ('2', 'b')]) 

In [14]: df 
Out[14]: 
     Col 1 Col 2 Col 3 
(1, a) NaN NaN NaN 
(2, a) NaN NaN NaN 
(1, b) NaN NaN NaN 
(2, b) NaN NaN NaN 

मैं

In [15]: df['Col 2'].loc[('1', 'b')] = 6 

In [16]: df 
Out[16]: 
     Col 1 Col 2 Col 3 
(1, a) NaN NaN NaN 
(2, a) NaN NaN NaN 
(1, b) NaN  6 NaN 
(2, b) NaN NaN NaN 

लेकिन जब मैं तत्व यह है कि मैं सिर्फ एक ही वाक्य रचना का उपयोग कर सेट संदर्भ में जाओ, मैं

प्राप्त एक मनमाना तत्व का मान सेट कर सकते हैं लग रहा है कि है
In [17]: df['Col 2'].loc[('1', 'b')] 
KeyError: 'the label [1] is not in the [index]' 

क्या कोई मुझे बता सकता है कि मैं क्या गलत कर रहा हूं या यह व्यवहार क्यों होता है? क्या मुझे इंडेक्स को बहु-तत्व टुपल के रूप में सेट करने की अनुमति नहीं है?

संपादित

जाहिर है, एक सूची में टपल सूचकांक लपेटकर काम करता है।

In [38]: df['Col 2'].loc[[('1', 'b')]] 
Out[38]: 
(1, b) 6 
Name: Col 2, dtype: object 

हालांकि मुझे अभी भी मेरे वास्तविक उपयोग मामले में कुछ अजीब व्यवहार मिल रहा है, इसलिए यह जानना अच्छा होगा कि यह अनुशंसित उपयोग नहीं है या नहीं।

+1

में [इस सवाल] (https://stackoverflow.com/questions/25476880/using-dataframe-ix-with-a-tuple-index-in-pandas) यह पता चलता है प्रतिक्रिया की सिफारिश नहीं कर रहा है ट्यूपल कुंजी और मल्टी इंडेक्स चयन के बीच अस्पष्टता का उपयोग कारण। –

उत्तर

4

चयन ब्रैकेट में आपका टुपल उन अनुक्रमों के रूप में देखा जाता है जिन्हें आप पुनर्प्राप्त करना चाहते हैं। ऐसा लगता है कि आप ['1', 'b'] को तर्क के रूप में पारित कर चुके होंगे। इस प्रकार KeyError संदेश: पांडा कुंजी '1' खोजने की कोशिश करता है और स्पष्ट रूप से इसे नहीं ढूंढता है।

यही कारण है कि जब आप अतिरिक्त ब्रैकेट जोड़ते हैं तो यह काम करता है, क्योंकि अब तर्क एक तत्व का अनुक्रम बन जाता है - आपका ट्यूपल।

आपको सूची में अस्पष्टताओं से निपटने और चयन में तर्कों को हल करने से बचना चाहिए। इंडेक्स एक साधारण इंडेक्स या मल्टीइंडेक्स होने के आधार पर व्यवहार भी भिन्न हो सकता है।

किसी भी मामले में, यदि आप यहां सिफारिशों के बारे में पूछते हैं, तो मुझे लगता है कि आपको ट्यूपल्स से बने सरल इंडेक्स बनाने की कोशिश नहीं करनी चाहिए: पांडा बेहतर काम करेंगे और यदि आप वास्तव में एक मल्टीडिएक्स बनाते हैं तो इसका उपयोग करने के लिए और अधिक शक्तिशाली होगा बजाय:

df = pd.DataFrame(columns=['Col 1', 'Col 2', 'Col 3'], 
        index=pd.MultiIndex.from_tuples([('1', 'a'), ('2', 'a'), ('1', 'b'), ('2', 'b')])) 

df['Col 2'].loc[('1', 'b')] = 6 

df['Col 2'].loc[('1', 'b')] 
Out[13]: 6 

df 
Out[14]: 
    Col 1 Col 2 Col 3 
1 a NaN NaN NaN 
2 a NaN NaN NaN 
1 b NaN  6 NaN 
2 b NaN NaN NaN