From 37ceb5d3236500a5b904def73ce41bf0627e164f Mon Sep 17 00:00:00 2001 From: Lyle Collins Date: Thu, 29 Mar 2018 17:16:21 +1100 Subject: [PATCH 1/3] BUG: #19497 fix. --- pandas/core/generic.py | 3 ++- pandas/core/internals.py | 9 +++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/pandas/core/generic.py b/pandas/core/generic.py index d5cd22732f0a9..21c92ba62eb84 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) @@ -971,7 +972,7 @@ def f(x): 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) + 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..76fcc19ae274a 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,7 @@ 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 +5235,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 +5252,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): From db9f6c5a2ac3902c01d74925a8025db85a15400b Mon Sep 17 00:00:00 2001 From: Lyle Collins Date: Thu, 29 Mar 2018 17:22:48 +1100 Subject: [PATCH 2/3] DOC: Include documentation in response to bug #19497 fix. --- pandas/core/frame.py | 4 ++++ 1 file changed, 4 insertions(+) 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 ------- From f79b82d26c55aab92161656c2ca8ec35f02e2b17 Mon Sep 17 00:00:00 2001 From: Lyle Collins Date: Thu, 29 Mar 2018 17:35:38 +1100 Subject: [PATCH 3/3] Formatting changes to pass flake8 tests. --- pandas/core/generic.py | 6 ++++-- pandas/core/internals.py | 3 ++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/pandas/core/generic.py b/pandas/core/generic.py index 21c92ba62eb84..ef0ab2cfce0c4 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -971,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, tupleize_cols=tupleize_cols) + 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 76fcc19ae274a..48ad53ee67f79 100644 --- a/pandas/core/internals.py +++ b/pandas/core/internals.py @@ -3294,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, tupleize_cols=tupleize_cols)) + obj.set_axis(axis, _transform_index(self.axes[axis], mapper, level, + tupleize_cols=tupleize_cols)) return obj def add_prefix(self, prefix):