docs: def _create_dataframe(cls, value):
          """
              Builds a dataframe from the value
          """
          try:
  
              ordered_jo = json.loads(six.text_type(value), object_pairs_hook=collections.OrderedDict)
  
              #Pandas does not maintain the order of dicts, so we must break the dict
              #up and put it into the dataframe manually to maintain the order.
  
              cols = list(ordered_jo.keys())
  
              if len(cols) == 0:
                  raise ValueError("Dataframe has no columns")
  
              #Assume all sub-dicts have the same set of keys
              if isinstance(ordered_jo[cols[0]], list):
                  index = range(len(ordered_jo[cols[0]]))
              else:
                  index = list(ordered_jo[cols[0]].keys())
              data = []
              for c in cols:
                  if isinstance(ordered_jo[c], list):
                      data.append(ordered_jo[c])
                  else:
                      data.append(list(ordered_jo[c].values()))
  
              # This goes in 'sideways' (cols=index, index=cols), so it needs to be transposed after to keep
              # the correct structure
              # We also try to coerce the data to a regular numpy array first. If the shape is correct
              # this is a much faster way of creating the DataFrame instance.
              try:
                  np_data = np.array(data)
              except ValueError:
                  np_data = None
  
              if np_data is not None and np_data.shape == (len(cols), len(index)):
                  df = pd.DataFrame(np_data, columns=index, index=cols).transpose()
              else:
                  # TODO should these heterogenous structure be supported?
                  # See https://github.com/hydraplatform/hydra-base/issues/72
                  df = pd.DataFrame(data, columns=index, index=cols).transpose()
  
  
          except ValueError as e:
              """ Raised on scalar types used as pd.DataFrame values
                  in absence of index arg
              """
              raise HydraError(str(e))
  
          except AssertionError as e:
              log.warning("An error occurred creating the new data frame: %s. Defaulting to a simple read_json"%(e))
              df = pd.read_json(value).fillna(0)
  
          return df