【发布时间】:2015-05-27 15:51:14
【问题描述】:
我认为我对 map 和 applymap 的理解非常好,但是遇到了问题(如果有兴趣,请参阅 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 )
这按预期工作 - 都在元素基础上运行,在系列上映射,在数据帧上应用映射(解释得很好 here btw)。
如果我使用字典而不是 lambda,map 仍然可以正常工作:
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')
所以,我的问题是为什么不在这里 map 和 applymap 以类似的方式工作?是applymap的bug,还是我做错了什么?
编辑添加:我发现我可以很容易地解决这个问题:
df.applymap( lambda x: dct[x] )
0 1
0 python gator
1 python python
或者通过这个不需要 lambda 的 answer 更好。
df.applymap( dct.get )
所以这几乎完全一样,对吧?必须与 applymap 解析语法的方式有关,我猜函数/方法的显式形式比字典更有效。无论如何,我想现在这里没有实际问题,但如果有人想回答,我仍然对这里发生的事情感兴趣。
【问题讨论】:
-
df.applymap() 不要在 DataFrame 的每个 Series 上应用 .map(),在每个 Series 上放置 map .apply()。请参阅此处的 Series .apply():link 并且 .apply() 需要一个函数作为参数,并且不能像 .map() 那样使用字典。
-
对不起,我真的不明白你在说什么。我想 applymap 和 map 是不等价的,我没有异议,但我对为什么或如何没有更好的理解。引用上面的链接(引用一个非常流行的 SO 答案):“applymap 在 DataFrame 上以元素方式工作,而 map 在系列上以元素方式工作。”我希望对这一点进行一些详细说明。