code: def add_data(self, new_cols=None):
          
          atoms = self['atom']
          data = constants.elements
          if pd.api.types.is_list_like(new_cols):
              new_cols = set(new_cols)
          elif new_cols is None:
              new_cols = set(data.columns)
          else:
              new_cols = [new_cols]
          new_frame = data.loc[atoms, set(new_cols) - set(self.columns)]
          new_frame.index = self.index
          return self.__class__(pd.concat([self._frame, new_frame], axis=1))
docs: Adds a column with the requested data.
  
          If you want to see for example the mass, the colormap used in
          jmol and the block of the element, just use::
  
              ['mass', 'jmol_color', 'block']
  
          The underlying ``pd.DataFrame`` can be accessed with
          ``constants.elements``.
          To see all available keys use ``constants.elements.info()``.
  
          The data comes from the module `mendeleev
          <http://mendeleev.readthedocs.org/en/latest/>`_ written
          by Lukasz Mentel.
  
          Please note that I added three columns to the mendeleev data::
  
              ['atomic_radius_cc', 'atomic_radius_gv', 'gv_color',
                  'valency']
  
          The ``atomic_radius_cc`` is used by default by this module
          for determining bond lengths.
          The three others are taken from the MOLCAS grid viewer written
          by Valera Veryazov.
  
          Args:
              new_cols (str): You can pass also just one value.
                  E.g. ``'mass'`` is equivalent to ``['mass']``. If
                  ``new_cols`` is ``None`` all available data
                  is returned.
              inplace (bool):
  
          Returns:
              Cartesian: