1
from collections import ChainMap
6
from pandas import DataFrame, Index, MultiIndex
7
import pandas._testing as tm
11
def test_rename(self, float_frame):
12
mapping = {"A": "a", "B": "b", "C": "c", "D": "d"}
14
renamed = float_frame.rename(columns=mapping)
15
renamed2 = float_frame.rename(columns=str.lower)
17
tm.assert_frame_equal(renamed, renamed2)
18
tm.assert_frame_equal(
19
renamed2.rename(columns=str.upper), float_frame, check_names=False
23
data = {"A": {"foo": 0, "bar": 1}}
25
# gets sorted alphabetical
27
renamed = df.rename(index={"foo": "bar", "bar": "foo"})
28
tm.assert_index_equal(renamed.index, Index(["foo", "bar"]))
30
renamed = df.rename(index=str.upper)
31
tm.assert_index_equal(renamed.index, Index(["BAR", "FOO"]))
33
# have to pass something
34
with pytest.raises(TypeError, match="must pass an index to rename"):
38
renamed = float_frame.rename(columns={"C": "foo", "D": "bar"})
39
tm.assert_index_equal(renamed.columns, Index(["A", "B", "foo", "bar"]))
42
renamed = float_frame.T.rename(index={"C": "foo", "D": "bar"})
43
tm.assert_index_equal(renamed.index, Index(["A", "B", "foo", "bar"]))
46
index = Index(["foo", "bar"], name="name")
47
renamer = DataFrame(data, index=index)
48
renamed = renamer.rename(index={"foo": "bar", "bar": "foo"})
49
tm.assert_index_equal(renamed.index, Index(["bar", "foo"], name="name"))
50
assert renamed.index.name == renamer.index.name
52
@pytest.mark.parametrize(
55
((ChainMap({"A": "a"}, {"B": "b"}),), dict(axis="columns")),
56
((), dict(columns=ChainMap({"A": "a"}, {"B": "b"}))),
59
def test_rename_chainmap(self, args, kwargs):
61
colAData = range(1, 11)
62
colBdata = np.random.randn(10)
64
df = DataFrame({"A": colAData, "B": colBdata})
65
result = df.rename(*args, **kwargs)
67
expected = DataFrame({"a": colAData, "b": colBdata})
68
tm.assert_frame_equal(result, expected)
70
def test_rename_multiindex(self):
72
tuples_index = [("foo1", "bar1"), ("foo2", "bar2")]
73
tuples_columns = [("fizz1", "buzz1"), ("fizz2", "buzz2")]
74
index = MultiIndex.from_tuples(tuples_index, names=["foo", "bar"])
75
columns = MultiIndex.from_tuples(tuples_columns, names=["fizz", "buzz"])
76
df = DataFrame([(0, 0), (1, 1)], index=index, columns=columns)
79
# without specifying level -> across all levels
82
index={"foo1": "foo3", "bar2": "bar3"},
83
columns={"fizz1": "fizz3", "buzz2": "buzz3"},
85
new_index = MultiIndex.from_tuples(
86
[("foo3", "bar1"), ("foo2", "bar3")], names=["foo", "bar"]
88
new_columns = MultiIndex.from_tuples(
89
[("fizz3", "buzz1"), ("fizz2", "buzz3")], names=["fizz", "buzz"]
91
tm.assert_index_equal(renamed.index, new_index)
92
tm.assert_index_equal(renamed.columns, new_columns)
93
assert renamed.index.names == df.index.names
94
assert renamed.columns.names == df.columns.names
97
# with specifying a level (GH13766)
100
new_columns = MultiIndex.from_tuples(
101
[("fizz3", "buzz1"), ("fizz2", "buzz2")], names=["fizz", "buzz"]
103
renamed = df.rename(columns={"fizz1": "fizz3", "buzz2": "buzz3"}, level=0)
104
tm.assert_index_equal(renamed.columns, new_columns)
105
renamed = df.rename(columns={"fizz1": "fizz3", "buzz2": "buzz3"}, level="fizz")
106
tm.assert_index_equal(renamed.columns, new_columns)
108
new_columns = MultiIndex.from_tuples(
109
[("fizz1", "buzz1"), ("fizz2", "buzz3")], names=["fizz", "buzz"]
111
renamed = df.rename(columns={"fizz1": "fizz3", "buzz2": "buzz3"}, level=1)
112
tm.assert_index_equal(renamed.columns, new_columns)
113
renamed = df.rename(columns={"fizz1": "fizz3", "buzz2": "buzz3"}, level="buzz")
114
tm.assert_index_equal(renamed.columns, new_columns)
118
new_columns = MultiIndex.from_tuples(
119
[("FIZZ1", "buzz1"), ("FIZZ2", "buzz2")], names=["fizz", "buzz"]
121
renamed = df.rename(columns=func, level=0)
122
tm.assert_index_equal(renamed.columns, new_columns)
123
renamed = df.rename(columns=func, level="fizz")
124
tm.assert_index_equal(renamed.columns, new_columns)
126
new_columns = MultiIndex.from_tuples(
127
[("fizz1", "BUZZ1"), ("fizz2", "BUZZ2")], names=["fizz", "buzz"]
129
renamed = df.rename(columns=func, level=1)
130
tm.assert_index_equal(renamed.columns, new_columns)
131
renamed = df.rename(columns=func, level="buzz")
132
tm.assert_index_equal(renamed.columns, new_columns)
135
new_index = MultiIndex.from_tuples(
136
[("foo3", "bar1"), ("foo2", "bar2")], names=["foo", "bar"]
138
renamed = df.rename(index={"foo1": "foo3", "bar2": "bar3"}, level=0)
139
tm.assert_index_equal(renamed.index, new_index)
141
def test_rename_nocopy(self, float_frame):
142
renamed = float_frame.rename(columns={"C": "foo"}, copy=False)
144
assert (float_frame["C"] == 1.0).all()
146
def test_rename_inplace(self, float_frame):
147
float_frame.rename(columns={"C": "foo"})
148
assert "C" in float_frame
149
assert "foo" not in float_frame
151
c_id = id(float_frame["C"])
152
float_frame = float_frame.copy()
153
return_value = float_frame.rename(columns={"C": "foo"}, inplace=True)
154
assert return_value is None
156
assert "C" not in float_frame
157
assert "foo" in float_frame
158
assert id(float_frame["foo"]) != c_id
160
def test_rename_bug(self):
162
# rename set ref_locs, and set_index was not resetting
163
df = DataFrame({0: ["foo", "bar"], 1: ["bah", "bas"], 2: [1, 2]})
164
df = df.rename(columns={0: "a"})
165
df = df.rename(columns={1: "b"})
166
df = df.set_index(["a", "b"])
167
df.columns = ["2001-01-01"]
168
expected = DataFrame(
170
index=MultiIndex.from_tuples(
171
[("foo", "bah"), ("bar", "bas")], names=["a", "b"]
173
columns=["2001-01-01"],
175
tm.assert_frame_equal(df, expected)
177
def test_rename_bug2(self):
179
# rename was changing Index to MultiIndex if Index contained tuples
181
df = DataFrame(data=np.arange(3), index=[(0, 0), (1, 1), (2, 2)], columns=["a"])
182
df = df.rename({(1, 1): (5, 4)}, axis="index")
183
expected = DataFrame(
184
data=np.arange(3), index=[(0, 0), (5, 4), (2, 2)], columns=["a"]
186
tm.assert_frame_equal(df, expected)
188
def test_rename_errors_raises(self):
189
df = DataFrame(columns=["A", "B", "C", "D"])
190
with pytest.raises(KeyError, match="'E'] not found in axis"):
191
df.rename(columns={"A": "a", "E": "e"}, errors="raise")
193
@pytest.mark.parametrize(
194
"mapper, errors, expected_columns",
196
({"A": "a", "E": "e"}, "ignore", ["a", "B", "C", "D"]),
197
({"A": "a"}, "raise", ["a", "B", "C", "D"]),
198
(str.lower, "raise", ["a", "b", "c", "d"]),
201
def test_rename_errors(self, mapper, errors, expected_columns):
203
# rename now works with errors parameter
204
df = DataFrame(columns=["A", "B", "C", "D"])
205
result = df.rename(columns=mapper, errors=errors)
206
expected = DataFrame(columns=expected_columns)
207
tm.assert_frame_equal(result, expected)
209
def test_rename_objects(self, float_string_frame):
210
renamed = float_string_frame.rename(columns=str.upper)
212
assert "FOO" in renamed
213
assert "foo" not in renamed
215
def test_rename_axis_style(self):
216
# https://github.com/pandas-dev/pandas/issues/12392
217
df = DataFrame({"A": [1, 2], "B": [1, 2]}, index=["X", "Y"])
218
expected = DataFrame({"a": [1, 2], "b": [1, 2]}, index=["X", "Y"])
220
result = df.rename(str.lower, axis=1)
221
tm.assert_frame_equal(result, expected)
223
result = df.rename(str.lower, axis="columns")
224
tm.assert_frame_equal(result, expected)
226
result = df.rename({"A": "a", "B": "b"}, axis=1)
227
tm.assert_frame_equal(result, expected)
229
result = df.rename({"A": "a", "B": "b"}, axis="columns")
230
tm.assert_frame_equal(result, expected)
233
expected = DataFrame({"A": [1, 2], "B": [1, 2]}, index=["x", "y"])
234
result = df.rename(str.lower, axis=0)
235
tm.assert_frame_equal(result, expected)
237
result = df.rename(str.lower, axis="index")
238
tm.assert_frame_equal(result, expected)
240
result = df.rename({"X": "x", "Y": "y"}, axis=0)
241
tm.assert_frame_equal(result, expected)
243
result = df.rename({"X": "x", "Y": "y"}, axis="index")
244
tm.assert_frame_equal(result, expected)
246
result = df.rename(mapper=str.lower, axis="index")
247
tm.assert_frame_equal(result, expected)
249
def test_rename_mapper_multi(self):
250
df = DataFrame({"A": ["a", "b"], "B": ["c", "d"], "C": [1, 2]}).set_index(
253
result = df.rename(str.upper)
254
expected = df.rename(index=str.upper)
255
tm.assert_frame_equal(result, expected)
257
def test_rename_positional_named(self):
258
# https://github.com/pandas-dev/pandas/issues/12392
259
df = DataFrame({"a": [1, 2], "b": [1, 2]}, index=["X", "Y"])
260
result = df.rename(index=str.lower, columns=str.upper)
261
expected = DataFrame({"A": [1, 2], "B": [1, 2]}, index=["x", "y"])
262
tm.assert_frame_equal(result, expected)
264
def test_rename_axis_style_raises(self):
266
df = DataFrame({"A": [1, 2], "B": [1, 2]}, index=["0", "1"])
268
# Named target and axis
269
over_spec_msg = "Cannot specify both 'axis' and any of 'index' or 'columns'"
270
with pytest.raises(TypeError, match=over_spec_msg):
271
df.rename(index=str.lower, axis=1)
273
with pytest.raises(TypeError, match=over_spec_msg):
274
df.rename(index=str.lower, axis="columns")
276
with pytest.raises(TypeError, match=over_spec_msg):
277
df.rename(columns=str.lower, axis="columns")
279
with pytest.raises(TypeError, match=over_spec_msg):
280
df.rename(index=str.lower, axis=0)
282
# Multiple targets and axis
283
with pytest.raises(TypeError, match=over_spec_msg):
284
df.rename(str.lower, index=str.lower, axis="columns")
287
over_spec_msg = "Cannot specify both 'mapper' and any of 'index' or 'columns'"
288
with pytest.raises(TypeError, match=over_spec_msg):
289
df.rename(str.lower, index=str.lower, columns=str.lower)
292
with pytest.raises(TypeError, match="multiple values"):
293
df.rename(id, mapper=id)
295
def test_rename_positional_raises(self):
297
df = DataFrame(columns=["A", "B"])
298
msg = r"rename\(\) takes from 1 to 2 positional arguments"
300
with pytest.raises(TypeError, match=msg):
301
df.rename(None, str.lower)
303
def test_rename_no_mappings_raises(self):
305
df = DataFrame([[1]])
306
msg = "must pass an index to rename"
307
with pytest.raises(TypeError, match=msg):
310
with pytest.raises(TypeError, match=msg):
311
df.rename(None, index=None)
313
with pytest.raises(TypeError, match=msg):
314
df.rename(None, columns=None)
316
with pytest.raises(TypeError, match=msg):
317
df.rename(None, columns=None, index=None)
319
def test_rename_mapper_and_positional_arguments_raises(self):
321
df = DataFrame([[1]])
322
msg = "Cannot specify both 'mapper' and any of 'index' or 'columns'"
323
with pytest.raises(TypeError, match=msg):
324
df.rename({}, index={})
326
with pytest.raises(TypeError, match=msg):
327
df.rename({}, columns={})
329
with pytest.raises(TypeError, match=msg):
330
df.rename({}, columns={}, index={})