docs: def to_cjson(self, buf=None, **kwargs):
          """Write a cjson file or return dictionary.
  
          The cjson format is specified
          `here <https://github.com/OpenChemistry/chemicaljson>`_.
  
          Args:
              buf (str): If it is a filepath, the data is written to
                  filepath. If it is None, a dictionary with the cjson
                  information is returned.
              kwargs: The keyword arguments are passed into the
                  ``dump`` function of the
                  `json library <https://docs.python.org/3/library/json.html>`_.
  
          Returns:
              dict:
          """
          cjson_dict = {'chemical json': 0}
  
          cjson_dict['atoms'] = {}
  
          atomic_number = constants.elements['atomic_number'].to_dict()
          cjson_dict['atoms'] = {'elements': {}}
          cjson_dict['atoms']['elements']['number'] = [
              int(atomic_number[x]) for x in self['atom']]
  
          cjson_dict['atoms']['coords'] = {}
          coords = self.loc[:, ['x', 'y', 'z']].values.reshape(len(self) * 3)
          cjson_dict['atoms']['coords']['3d'] = [float(x) for x in coords]
  
          bonds = []
          bond_dict = self.get_bonds()
          for i in bond_dict:
              for b in bond_dict[i]:
                  bonds += [int(i), int(b)]
                  bond_dict[b].remove(i)
  
          cjson_dict['bonds'] = {'connections': {}}
          cjson_dict['bonds']['connections']['index'] = bonds
  
          if buf is not None:
              with open(buf, mode='w') as f:
                  f.write(json.dumps(cjson_dict, **kwargs))
          else:
              return cjson_dict