code: def applymap(self, func):
          
  
          # if we have a dtype == 'M8[ns]', provide boxed values
          def infer(x):
              if x.empty:
                  return lib.map_infer(x, func)
              return lib.map_infer(x.astype(object).values, func)
  
          return self.apply(infer)
docs: Apply a function to a Dataframe elementwise.
  
          This method applies a function that accepts and returns a scalar
          to every element of a DataFrame.
  
          Parameters
          ----------
          func : callable
              Python function, returns a single value from a single value.
  
          Returns
          -------
          DataFrame
              Transformed DataFrame.
  
          See Also
          --------
          DataFrame.apply : Apply a function along input axis of DataFrame.
  
          Notes
          -----
          In the current implementation applymap calls `func` twice on the
          first column/row to decide whether it can take a fast or slow
          code path. This can lead to unexpected behavior if `func` has
          side-effects, as they will take effect twice for the first
          column/row.
  
          Examples
          --------
          >>> df = pd.DataFrame([[1, 2.12], [3.356, 4.567]])
          >>> df
                 0      1
          0  1.000  2.120
          1  3.356  4.567
  
          >>> df.applymap(lambda x: len(str(x)))
             0  1
          0  3  4
          1  5  5
  
          Note that a vectorized version of `func` often exists, which will
          be much faster. You could square each number elementwise.
  
          >>> df.applymap(lambda x: x**2)
                     0          1
          0   1.000000   4.494400
          1  11.262736  20.857489
  
          But it's better to avoid applymap in that case.
  
          >>> df ** 2
                     0          1
          0   1.000000   4.494400
          1  11.262736  20.857489