code: def init_dict(data, index, columns, dtype=None):
      
      if columns is not None:
          from pandas.core.series import Series
          arrays = Series(data, index=columns, dtype=object)
          data_names = arrays.index
  
          missing = arrays.isnull()
          if index is None:
              # GH10856
              # raise ValueError if only scalars in dict
              index = extract_index(arrays[~missing])
          else:
              index = ensure_index(index)
  
          # no obvious "empty" int column
          if missing.any() and not is_integer_dtype(dtype):
              if dtype is None or np.issubdtype(dtype, np.flexible):
                  # GH#1783
                  nan_dtype = object
              else:
                  nan_dtype = dtype
              val = construct_1d_arraylike_from_scalar(np.nan, len(index),
                                                       nan_dtype)
              arrays.loc[missing] = [val] * missing.sum()
  
      else:
          keys = com.dict_keys_to_ordered_list(data)
          columns = data_names = Index(keys)
          # GH#24096 need copy to be deep for datetime64tz case
          # TODO: See if we can avoid these copies
          arrays = [data[k] if not is_datetime64tz_dtype(data[k]) else
                    data[k].copy(deep=True) for k in keys]
      return arrays_to_mgr(arrays, data_names, index, columns, dtype=dtype)
docs: Segregate Series based on type and coerce into matrices.
      Needs to handle a lot of exceptional cases.