diff --git a/pandas/core/frame.py b/pandas/core/frame.py index ace975385ce32..236b0109da786 100644 --- a/pandas/core/frame.py +++ b/pandas/core/frame.py @@ -3642,6 +3642,10 @@ def rename(self, *args, **kwargs): level : int or level name, default None In case of a MultiIndex, only rename labels in the specified level. + tupleize_cols : boolean, default False + In case of an Index, when True, create MultiIndex if possible. + False ensures that an Index will not be converted to a + MultiIndex if labels are 'rename'd. Returns ------- diff --git a/pandas/core/generic.py b/pandas/core/generic.py index d5cd22732f0a9..ef0ab2cfce0c4 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -933,6 +933,7 @@ def rename(self, *args, **kwargs): inplace = kwargs.pop('inplace', False) level = kwargs.pop('level', None) axis = kwargs.pop('axis', None) + tupleize_cols = kwargs.pop('tupleize_cols', False) if axis is not None: axis = self._get_axis_number(axis) @@ -970,8 +971,10 @@ def f(x): baxis = self._get_block_manager_axis(axis) if level is not None: level = self.axes[axis]._get_level_number(level) - result._data = result._data.rename_axis(f, axis=baxis, copy=copy, - level=level) + result._data = \ + result._data.rename_axis(f, axis=baxis, copy=copy, + level=level, + tupleize_cols=tupleize_cols) result._clear_item_cache() if inplace: diff --git a/pandas/core/internals.py b/pandas/core/internals.py index a0e122d390240..48ad53ee67f79 100644 --- a/pandas/core/internals.py +++ b/pandas/core/internals.py @@ -3280,7 +3280,8 @@ def set_axis(self, axis, new_labels): self.axes[axis] = new_labels - def rename_axis(self, mapper, axis, copy=True, level=None): + def rename_axis(self, mapper, axis, copy=True, level=None, + tupleize_cols=False): """ Rename one of axes. @@ -3293,7 +3294,8 @@ def rename_axis(self, mapper, axis, copy=True, level=None): """ obj = self.copy(deep=copy) - obj.set_axis(axis, _transform_index(self.axes[axis], mapper, level)) + obj.set_axis(axis, _transform_index(self.axes[axis], mapper, level, + tupleize_cols=tupleize_cols)) return obj def add_prefix(self, prefix): @@ -5234,7 +5236,7 @@ def _safe_reshape(arr, new_shape): return arr -def _transform_index(index, func, level=None): +def _transform_index(index, func, level=None, tupleize_cols=True): """ Apply function to all values found in index. @@ -5251,7 +5253,7 @@ def _transform_index(index, func, level=None): return MultiIndex.from_tuples(items, names=index.names) else: items = [func(x) for x in index] - return Index(items, name=index.name) + return Index(items, name=index.name, tupleize_cols=tupleize_cols) def _putmask_smart(v, m, n):