Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add inplace support for rename_axis #16505

Merged
merged 2 commits into from
Jun 13, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions doc/source/whatsnew/v0.21.0.txt
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ Other Enhancements
- The ``validate`` argument for :func:`merge` function now checks whether a merge is one-to-one, one-to-many, many-to-one, or many-to-many. If a merge is found to not be an example of specified merge type, an exception of type ``MergeError`` will be raised. For more, see :ref:`here <merging.validation>` (:issue:`16270`)
- ``Series.to_dict()`` and ``DataFrame.to_dict()`` now support an ``into`` keyword which allows you to specify the ``collections.Mapping`` subclass that you would like returned. The default is ``dict``, which is backwards compatible. (:issue:`16122`)
- ``RangeIndex.append`` now returns a ``RangeIndex`` object when possible (:issue:`16212`)
- ``Series.rename_axis()`` and ``DataFrame.rename_axis()`` with ``inplace=True`` now return None while renaming the axis inplace. (:issue:`15704`)
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@jreback - added

- :func:`to_pickle` has gained a protocol parameter (:issue:`16252`). By default, this parameter is set to `HIGHEST_PROTOCOL <https://docs.python.org/3/library/pickle.html#data-stream-format>`__
- :func:`api.types.infer_dtype` now infers decimals. (:issue: `15690`)
- :func:`read_feather` has gained the ``nthreads`` parameter for multi-threaded operations (:issue:`16359`)
Expand Down
20 changes: 13 additions & 7 deletions pandas/core/generic.py
Original file line number Diff line number Diff line change
Expand Up @@ -753,7 +753,7 @@ def rename_axis(self, mapper, axis=0, copy=True, inplace=False):

Returns
-------
renamed : type of caller
renamed : type of caller or None if inplace=True

See Also
--------
Expand Down Expand Up @@ -784,27 +784,31 @@ def rename_axis(self, mapper, axis=0, copy=True, inplace=False):
non_mapper = is_scalar(mapper) or (is_list_like(mapper) and not
is_dict_like(mapper))
if non_mapper:
return self._set_axis_name(mapper, axis=axis)
return self._set_axis_name(mapper, axis=axis, inplace=inplace)
else:
axis = self._get_axis_name(axis)
d = {'copy': copy, 'inplace': inplace}
d[axis] = mapper
return self.rename(**d)

def _set_axis_name(self, name, axis=0):
def _set_axis_name(self, name, axis=0, inplace=False):
"""
Alter the name or names of the axis, returning self.
Alter the name or names of the axis.

Parameters
----------
name : str or list of str
Name for the Index, or list of names for the MultiIndex
axis : int or str
0 or 'index' for the index; 1 or 'columns' for the columns
inplace : bool
whether to modify `self` directly or return a copy
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

versionadded tag

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Which version should I specify?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Specified 0.20.2

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

move to 0.21.0


.. versionadded: 0.21.0

Returns
-------
renamed : type of caller
renamed : type of caller or None if inplace=True

See Also
--------
Expand All @@ -831,9 +835,11 @@ def _set_axis_name(self, name, axis=0):
axis = self._get_axis_number(axis)
idx = self._get_axis(axis).set_names(name)

renamed = self.copy(deep=True)
inplace = validate_bool_kwarg(inplace, 'inplace')
renamed = self if inplace else self.copy()
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is there a reason you removed the deep=True ?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's the default and can thus be removed (as of @jreback's request that disappeared after my rebase).
https://github.com/pandas-dev/pandas/blob/master/pandas/core/generic.py#L3523

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OK, perfect! (I looked for a comment about it, but didn't find one :-))

renamed.set_axis(axis, idx)
return renamed
if not inplace:
return renamed

# ----------------------------------------------------------------------
# Comparisons
Expand Down
17 changes: 17 additions & 0 deletions pandas/tests/frame/test_alter_axes.py
Original file line number Diff line number Diff line change
Expand Up @@ -418,6 +418,23 @@ def test_rename(self):
pd.Index(['bar', 'foo'], name='name'))
assert renamed.index.name == renamer.index.name

def test_rename_axis_inplace(self):
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can you also add a similar test in series/test_alter_axes.py

and tests this with axis=1 as well.

# GH 15704
frame = self.frame.copy()
expected = frame.rename_axis('foo')
result = frame.copy()
no_return = result.rename_axis('foo', inplace=True)

assert no_return is None
assert_frame_equal(result, expected)

expected = frame.rename_axis('bar', axis=1)
result = frame.copy()
no_return = result.rename_axis('bar', axis=1, inplace=True)

assert no_return is None
assert_frame_equal(result, expected)

def test_rename_multiindex(self):

tuples_index = [('foo1', 'bar1'), ('foo2', 'bar2')]
Expand Down
10 changes: 10 additions & 0 deletions pandas/tests/series/test_alter_axes.py
Original file line number Diff line number Diff line change
Expand Up @@ -224,3 +224,13 @@ def test_reorder_levels(self):

result = s.reorder_levels(['L0', 'L0', 'L0'])
assert_series_equal(result, expected)

def test_rename_axis_inplace(self):
# GH 15704
series = self.ts.copy()
expected = series.rename_axis('foo')
result = series.copy()
no_return = result.rename_axis('foo', inplace=True)

assert no_return is None
assert_series_equal(result, expected)