वस्तुओं से पांडस सूचकांक

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

class WrapStr(object):
    def __init__(self,str):
       self.str = str
    def __eq__(self,other):
       return self.str == other.str
    def __repr__(self):
       return self.str

समस्या यह है कि pd.Index WrapStr उदाहरण पर eq विधि को कॉल नहीं करता है, बल्कि इसके बजाय यह जांचता है कि क्या दो उदाहरण समान हैं।

first_ins = WrapStr('col1')
my_ix = pd.Index([first_ins])
sec_ins = WrapStr('col1')

print first_ins in my_ix # True
print sec_ins in my_ix # False

ऐसा लगता है कि शामिल चेक https में परिभाषित किया गया है : //github.com/pydata/pandas/blob/master/pandas/index.pyx पंक्तियां 92 और 448।

इस तरह के विस्तारित कॉलम लेबल का समर्थन करने के तरीके पर कोई विचार?

0
त्वरित प्रतिक्रिया जेफ के लिए धन्यवाद!
जोड़ा लेखक bjonen, स्रोत
यह सामान्य रूप से संभव नहीं है। स्ट्रिंग्स को सी-हैशबल, आईओओ, सी-लिब्स की आवश्यकता होती है जो इंडेक्स कैल्क्स स्ट्रिंग की अपेक्षा कर रहे हैं। आप __ हैश __ को परिभाषित करने का प्रयास कर सकते हैं, काम कर सकते हैं।
जोड़ा लेखक Jeff, स्रोत

1 उत्तर

__ हैश __ विधि WrapStr पर जोड़ें:

class WrapStr(object):
    def __init__(self,str):
       self.str = str
    def __eq__(self,other):
       return self.str == other.str
    def __repr__(self):
       return self.str
    def __hash__(self):
        return hash(self.str)

first_ins = WrapStr('col1')
my_ix = pd.Index([first_ins])
sec_ins = WrapStr('col1')

print first_ins in my_ix # True
print sec_ins in my_ix # False
0
जोड़ा
अति उत्कृष्ट। यह काम करता है और पांडा को मेरे लिए और भी उपयोगी बनाता है। धन्यवाद।
जोड़ा लेखक bjonen, स्रोत