docs: def objify(self, doc, columns=None):
          """
          Decode a Pymongo SON object into an Pandas DataFrame
          """
          cols = columns or doc[METADATA][COLUMNS]
          data = {}
  
          for col in cols:
              # if there is missing data in a chunk, we can default to NaN
              # and pandas will autofill the missing values to the correct length
              if col not in doc[METADATA][LENGTHS]:
                  d = [np.nan]
              else:
                  d = decompress(doc[DATA][doc[METADATA][LENGTHS][col][0]: doc[METADATA][LENGTHS][col][1] + 1])
                  # d is ready-only but that's not an issue since DataFrame will copy the data anyway.
                  d = np.frombuffer(d, doc[METADATA][DTYPE][col])
  
                  if MASK in doc[METADATA] and col in doc[METADATA][MASK]:
                      mask_data = decompress(doc[METADATA][MASK][col])
                      mask = np.frombuffer(mask_data, 'bool')
                      d = ma.masked_array(d, mask)
              data[col] = d
  
          # Copy into
          return pd.DataFrame(data, columns=cols, copy=True)[cols]