<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def add_data(self, new_cols=None):
 """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: """

        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))