code: def _try_cast_result(self, result, dtype=None):
          
          if dtype is None:
              dtype = self.dtype
  
          if self.is_integer or self.is_bool or self.is_datetime:
              pass
          elif self.is_float and result.dtype == self.dtype:
  
              # protect against a bool/object showing up here
              if isinstance(dtype, str) and dtype == 'infer':
                  return result
              if not isinstance(dtype, type):
                  dtype = dtype.type
              if issubclass(dtype, (np.bool_, np.object_)):
                  if issubclass(dtype, np.bool_):
                      if isna(result).all():
                          return result.astype(np.bool_)
                      else:
                          result = result.astype(np.object_)
                          result[result == 1] = True
                          result[result == 0] = False
                          return result
                  else:
                      return result.astype(np.object_)
  
              return result
  
          # may need to change the dtype here
          return maybe_downcast_to_dtype(result, dtype)
docs: try to cast the result to our original type, we may have
          roundtripped thru object in the mean-time