2015-05-27 8 views
7

पास करते समय मानचित्र बनाम लागूमैप मैंने सोचा कि मैं नक्शा बनाम लागूमैप को अच्छी तरह से समझता हूं, लेकिन मुझे कोई समस्या है (यदि रुचि हो तो अतिरिक्त पृष्ठभूमि के लिए here देखें)।एक शब्दकोश

एक साधारण उदाहरण:

df = pd.DataFrame([[1,2],[1,1]]) 
dct = { 1:'python', 2:'gator' } 

df[0].map(lambda x: x+90) 
df.applymap(lambda x: x+90) 

कि अपेक्षा के अनुरूप काम करता है - दोनों एक elementwise आधार पर काम करते हैं, एक श्रृंखला पर नक्शा, एक dataframe पर applymap (बहुत अच्छी तरह से here btw समझाया गया है)।

अगर मैं एक लैम्ब्डा के बजाय एक शब्दकोश का उपयोग करें, मानचित्र अभी भी ठीक काम करता है:

df[0].map(dct) 

0 python 
1 python 

नहीं बल्कि applymap:

df.applymap(dct) 
--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-100-7872ff604851> in <module>() 
----> 1 df.applymap(dct) 

C:\Users\johne\AppData\Local\Continuum\Anaconda\lib\site-packages\pandas\core\frame.pyc in applymap(self, func) 
    3856     x = lib.map_infer(_values_from_object(x), f) 
    3857    return lib.map_infer(_values_from_object(x), func) 
-> 3858   return self.apply(infer) 
    3859 
    3860  #---------------------------------------------------------------------- 

C:\Users\johne\AppData\Local\Continuum\Anaconda\lib\site-packages\pandas\core\frame.pyc in apply(self, func, axis, broadcast, raw, reduce, args, **kwds) 
    3687      if reduce is None: 
    3688       reduce = True 
-> 3689      return self._apply_standard(f, axis, reduce=reduce) 
    3690    else: 
    3691     return self._apply_broadcast(f, axis) 

C:\Users\johne\AppData\Local\Continuum\Anaconda\lib\site-packages\pandas\core\frame.pyc in _apply_standard(self, func, axis, ignore_failures, reduce) 
    3777    try: 
    3778     for i, v in enumerate(series_gen): 
-> 3779      results[i] = func(v) 
    3780      keys.append(v.name) 
    3781    except Exception as e: 

C:\Users\johne\AppData\Local\Continuum\Anaconda\lib\site-packages\pandas\core\frame.pyc in infer(x) 
    3855     f = com.i8_boxer(x) 
    3856     x = lib.map_infer(_values_from_object(x), f) 
-> 3857    return lib.map_infer(_values_from_object(x), func) 
    3858   return self.apply(infer) 
    3859 

C:\Users\johne\AppData\Local\Continuum\Anaconda\lib\site-packages\pandas\lib.pyd in pandas.lib.map_infer (pandas\lib.c:56990)() 

TypeError: ("'dict' object is not callable", u'occurred at index 0') 

तो, मेरे सवाल क्यों मैप नहीं और applymap काम है यहाँ एक समान तरीके से? क्या यह Applymap के साथ एक बग है, या मैं कुछ गलत कर रहा हूँ? इस answer जो कोई लैम्ब्डा की आवश्यकता है के माध्यम से

df.applymap(lambda x: dct[x]) 

     0  1 
0 python gator 
1 python python 

या बेहतर अभी तक: जोड़ने

संपादित करने के लिए: मैं ने पाया है कि मैं इस के साथ काफी आसानी से इस पर काम कर सकते हैं।

df.applymap(dct.get) 

तो यह काफी सटीक बराबर है, है ना? यह लागू होना चाहिए कि कैसे लागूमैप वाक्यविन्यास को पार करता है और मुझे लगता है कि फ़ंक्शन/विधि का स्पष्ट रूप किसी शब्दकोश से बेहतर काम करता है। वैसे भी, मुझे लगता है कि अब यहां कोई व्यावहारिक समस्या नहीं है, लेकिन अगर कोई जवाब देना चाहता है तो अभी भी क्या हो रहा है में दिलचस्पी है।

+1

df.applymap() डेटाफ्रेम की प्रत्येक श्रृंखला पर .map() लागू नहीं करते हैं, प्रत्येक श्रृंखला पर मानचित्र .apply() डाल दें। सीरीज़ .apply() यहां देखें: [लिंक] (http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.apply.html) और .apply() को फ़ंक्शन के रूप में फ़ंक्शन की आवश्यकता है और .map() कर सकते हैं के रूप में एक उपन्यास नहीं ले सकते हैं। –

+1

क्षमा करें, मैं वास्तव में समझ नहीं पा रहा हूं कि आप यहां क्या कह रहे हैं। मुझे लगता है कि Applymap और map समकक्ष नहीं हैं, जिन पर मैं विवाद नहीं करता हूं, लेकिन मुझे इस बारे में कोई बेहतर समझ नहीं है कि क्यों या कैसे। उपरोक्त लिंक से उद्धृत करने के लिए (एक बहुत ही लोकप्रिय SO उत्तर में): "applymap डेटाफ्रेम पर तत्व-वार काम करता है, और नक्शा एक श्रृंखला पर तत्व-वार काम करता है।" मैं उस बिंदु पर कुछ विस्तार की उम्मीद कर रहा हूं। – JohnE

उत्तर

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