def METHOD_NAME(self, first, other, func, **kwargs):
    """
    Apply `func` to values associated with `first`/`other` keys of `self.cudf_dataframe_dict` with storing of the result.
    Store the return value of `func` (a new ``cudf.DataFrame``)
    into `self.cudf_dataframe_dict`.
    Parameters
    ----------
    first : int
        The first key associated with dataframe from `self.cudf_dataframe_dict`.
    other : int or ray.ObjectRef
        The second key associated with dataframe from `self.cudf_dataframe_dict`.
        If it isn't a real key, the `func` will be applied to the `first` only.
    func : callable
        A function to apply.
    **kwargs : dict
        Additional keywords arguments to be passed in `func`.
    Returns
    -------
    int
        The new key of the new dataframe stored in `self.cudf_dataframe_dict`
        (will be a ``ray.ObjectRef`` in outside level).
    """
    df1 = self.cudf_dataframe_dict[first]
    if not other:
        result = func(df1, **kwargs)
        return self.store_new_df(result)
    if not isinstance(other, int):
        assert isinstance(other, ray.ObjectRef)
        df2 = RayWrapper.materialize(other)
    else:
        df2 = self.cudf_dataframe_dict[other]
    result = func(df1, df2, **kwargs)
    return self.store_new_df(result)