def _map_series_op(self, op: str, other: Any) -> 'DataFrame':
    from pyspark.pandas.base import IndexOpsMixin
    if ((not isinstance(other, DataFrame)) and (isinstance(other, IndexOpsMixin) or is_sequence(other))):
        raise TypeError(('%s with a sequence is currently not supported; however, got %s.' % (op, type(other).__name__)))
    if isinstance(other, DataFrame):
        if (self._internal.column_labels_level != other._internal.column_labels_level):
            raise ValueError('cannot join with no overlapping index names')
        if (not same_anchor(self, other)):

            def apply_op(psdf: DataFrame, this_column_labels: List[Label], that_column_labels: List[Label]) -> Iterator[Tuple[('Series', Label)]]:
                for (this_label, that_label) in zip(this_column_labels, that_column_labels):
                    (yield (getattr(psdf._psser_for(this_label), op)(psdf._psser_for(that_label)).rename(this_label), this_label))
            return align_diff_frames(apply_op, self, other, fillna=True, how='full')
        else:
            applied = []
            column_labels = []
            for label in self._internal.column_labels:
                if (label in other._internal.column_labels):
                    applied.append(getattr(self._psser_for(label), op)(other._psser_for(label)))
                else:
                    applied.append(SF.lit(None).cast(self._internal.spark_type_for(label)).alias(name_like_string(label)))
                column_labels.append(label)
            for label in other._internal.column_labels:
                if (label not in column_labels):
                    applied.append(SF.lit(None).cast(other._internal.spark_type_for(label)).alias(name_like_string(label)))
                    column_labels.append(label)
            internal = self._internal.with_new_columns(applied, column_labels=column_labels)
            return DataFrame(internal)
    else:
        return self._apply_series_op((lambda psser: getattr(psser, op)(other)))
def _map_series_op(self, op: str, other: Any) -> 'DataFrame':
    from pyspark.pandas.base import IndexOpsMixin
    if ((not isinstance(other, DataFrame)) and (isinstance(other, IndexOpsMixin) or is_sequence(other))):
        raise TypeError(('%s with a sequence is currently not supported; however, got %s.' % (op, type(other).__name__)))
    if isinstance(other, DataFrame):
        if (self._internal.column_labels_level != other._internal.column_labels_level):
            raise ValueError('cannot join with no overlapping index names')
        if (not same_anchor(self, other)):

            def apply_op(psdf: DataFrame, this_column_labels: List[Label], that_column_labels: List[Label]) -> Iterator[Tuple[('Series', Label)]]:
                for (this_label, that_label) in zip(this_column_labels, that_column_labels):
                    (yield (getattr(psdf._psser_for(this_label), op)(psdf._psser_for(that_label)).rename(this_label), this_label))
            return align_diff_frames(apply_op, self, other, fillna=True, how='full')
        else:
            applied = []
            column_labels = []
            for label in self._internal.column_labels:
                if (label in other._internal.column_labels):
                    applied.append(getattr(self._psser_for(label), op)(other._psser_for(label)))
                else:
                    applied.append(SF.lit(None).cast(self._internal.spark_type_for(label)).alias(name_like_string(label)))
                column_labels.append(label)
            for label in other._internal.column_labels:
                if (label not in column_labels):
                    applied.append(SF.lit(None).cast(other._internal.spark_type_for(label)).alias(name_like_string(label)))
                    column_labels.append(label)
            internal = self._internal.with_new_columns(applied, column_labels=column_labels)
            return DataFrame(internal)
    else:
        return self._apply_series_op((lambda psser: getattr(psser, op)(other)))