Tôi nghĩ tôi đã hiểu bản đồ so với bản đồ áp dụng khá tốt, nhưng đang gặp sự cố (xem here để biết thêm nền, nếu quan tâm).Bản đồ so với bản đồ áp dụng khi chuyển từ điển
Một ví dụ đơn giản:
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)
đó làm việc như mong đợi - cả hai hoạt động trên cơ sở elementwise, bản đồ trên một loạt, applymap trên dataframe (giải thích rất tốt here btw).
Nếu tôi sử dụng một cuốn từ điển chứ không phải là một lambda, bản đồ vẫn hoạt động tốt:
df[0].map(dct)
0 python
1 python
nhưng không 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')
Vì vậy, câu hỏi của tôi là tại sao không lập bản đồ và làm việc applymap một cách tương tự ở đây? Nó là một lỗi với applicmap, hoặc tôi đang làm điều gì đó sai?
Chỉnh sửa để thêm: Tôi đã phát hiện ra rằng tôi có thể làm việc xung quanh này khá dễ dàng với điều này:
df.applymap(lambda x: dct[x])
0 1
0 python gator
1 python python
Hoặc tốt hơn qua answer này mà không yêu cầu phải lambda.
df.applymap(dct.get)
Vì vậy, đó là khá chính xác tương đương, phải không? Phải là một cái gì đó với cách áp dụng phân tích cú pháp cú pháp và tôi đoán hình thức rõ ràng của một hàm/phương thức hoạt động tốt hơn một từ điển. Dù sao, tôi đoán bây giờ không có vấn đề thực tế còn lại ở đây nhưng tôi vẫn quan tâm đến những gì đang xảy ra ở đây nếu có ai muốn trả lời.
df.applymap() không áp dụng .map() trên mỗi Series của DataFrame, đặt bản đồ .apply() trên mỗi Series. Xem Chuỗi .apply() tại đây: [link] (http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.apply.html) Và .apply() cần một hàm làm đối số và không thể lấy một từ điển như .map() có thể làm. –
Xin lỗi, tôi thực sự không hiểu bạn đang nói gì ở đây. Tôi đoán rằng áp dụng bản đồ và bản đồ là không tương đương, mà tôi không tranh chấp, nhưng tôi không có bất kỳ sự hiểu biết tốt hơn về lý do tại sao hoặc như thế nào. Để trích dẫn từ liên kết ở trên (đến một câu trả lời SO rất phổ biến): "applymap hoạt động trên phần tử DataFrame và bản đồ hoạt động trên phần tử". Tôi hy vọng cho một số xây dựng vào thời điểm đó. – JohnE