Skip to content

Commit 45ccb39

Browse files
committed
ENH: GH13473 Add errors parameter to DataFrame.rename
1 parent bd49d2f commit 45ccb39

File tree

3 files changed

+40
-2
lines changed

3 files changed

+40
-2
lines changed

pandas/core/frame.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3940,7 +3940,8 @@ def rename(self, *args, **kwargs):
39403940
level : int or level name, default None
39413941
In case of a MultiIndex, only rename labels in the specified
39423942
level.
3943-
3943+
errors : {'ignore', 'raise'}, default 'ignore'
3944+
If 'ignore', suppress error and existing labels are renamed.
39443945
Returns
39453946
-------
39463947
DataFrame
@@ -3949,6 +3950,11 @@ def rename(self, *args, **kwargs):
39493950
--------
39503951
DataFrame.rename_axis
39513952
3953+
Raises
3954+
------
3955+
KeyError
3956+
If any of the labels is not found in the selected axis.
3957+
39523958
Examples
39533959
--------
39543960

pandas/core/generic.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -981,11 +981,18 @@ def rename(self, *args, **kwargs):
981981
level : int or level name, default None
982982
In case of a MultiIndex, only rename labels in the specified
983983
level.
984+
errors : {'ignore', 'raise'}, default 'ignore'
985+
If 'ignore', suppress error and existing labels are renamed.
984986
985987
Returns
986988
-------
987989
renamed : %(klass)s (new object)
988990
991+
Raises
992+
------
993+
KeyError
994+
If any of the labels is not found in the selected axis.
995+
989996
See Also
990997
--------
991998
NDFrame.rename_axis
@@ -1065,6 +1072,7 @@ def rename(self, *args, **kwargs):
10651072
inplace = kwargs.pop('inplace', False)
10661073
level = kwargs.pop('level', None)
10671074
axis = kwargs.pop('axis', None)
1075+
errors = kwargs.pop('errors', 'ignore')
10681076
if axis is not None:
10691077
# Validate the axis
10701078
self._get_axis_number(axis)
@@ -1085,10 +1093,15 @@ def rename(self, *args, **kwargs):
10851093
if v is None:
10861094
continue
10871095
f = com._get_rename_function(v)
1088-
10891096
baxis = self._get_block_manager_axis(axis)
10901097
if level is not None:
10911098
level = self.axes[axis]._get_level_number(level)
1099+
1100+
# GH 13473
1101+
labels_missing = (self.axes[axis].get_indexer_for(v) == -1).any()
1102+
if errors == 'raise' and labels_missing:
1103+
raise KeyError('{} not found in axis'.format(v))
1104+
10921105
result._data = result._data.rename_axis(f, axis=baxis, copy=copy,
10931106
level=level)
10941107
result._clear_item_cache()

pandas/tests/frame/test_alter_axes.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -871,6 +871,25 @@ def test_rename_bug2(self):
871871
columns=["a"])
872872
tm.assert_frame_equal(df, expected)
873873

874+
def test_rename_errors(self):
875+
# GH 13473
876+
# rename now works with errors parameter
877+
878+
# Error has to be thrown and is thrown
879+
df = DataFrame(columns=['A', 'B', 'C', 'D'])
880+
with pytest.raises(KeyError):
881+
df.rename(columns={'A': 'a', 'E': 'e'}, errors='raise')
882+
883+
# Error should be ignored
884+
renamed = df.rename(columns={'A': 'a', 'E': 'e'})
885+
expected = DataFrame(columns=['a', 'B', 'C', 'D'])
886+
tm.assert_frame_equal(renamed, expected)
887+
888+
# Correct behaviour with raising errors.
889+
renamed = df.rename(columns={'A': 'a'}, errors='raise')
890+
expected = DataFrame(columns=['a', 'B', 'C', 'D'])
891+
tm.assert_frame_equal(renamed, expected)
892+
874893
def test_reorder_levels(self):
875894
index = MultiIndex(levels=[['bar'], ['one', 'two', 'three'], [0, 1]],
876895
codes=[[0, 0, 0, 0, 0, 0],

0 commit comments

Comments
 (0)