Skip to content

Commit ede455f

Browse files
committed
allow level to be passed positionally
1 parent 862addf commit ede455f

File tree

10 files changed

+34
-24
lines changed

10 files changed

+34
-24
lines changed

doc/source/user_guide/cookbook.rst

+1-1
Original file line numberDiff line numberDiff line change
@@ -312,7 +312,7 @@ The :ref:`multindexing <advanced.hierarchical>` docs.
312312
df.columns = pd.MultiIndex.from_tuples([tuple(c.split("_")) for c in df.columns])
313313
df
314314
# Now stack & Reset
315-
df = df.stack(0).reset_index(level=1)
315+
df = df.stack(0).reset_index(1)
316316
df
317317
# And fix the labels (Notice the label 'level_1' got added automatically)
318318
df.columns = ["Sample", "All_X", "All_Y"]

doc/source/whatsnew/v1.3.0.rst

+1-1
Original file line numberDiff line numberDiff line change
@@ -647,7 +647,7 @@ Deprecations
647647
- Deprecated setting :attr:`Categorical._codes`, create a new :class:`Categorical` with the desired codes instead (:issue:`40606`)
648648
- Deprecated behavior of :meth:`DatetimeIndex.union` with mixed timezones; in a future version both will be cast to UTC instead of object dtype (:issue:`39328`)
649649
- Deprecated using ``usecols`` with out of bounds indices for ``read_csv`` with ``engine="c"`` (:issue:`25623`)
650-
- Deprecated passing arguments as positional in :meth:`DataFrame.reset_index` and :meth:`Series.reset_index` (:issue:`41485`)
650+
- Deprecated passing arguments as positional (except for ``"level"``) in :meth:`DataFrame.reset_index` and :meth:`Series.reset_index` (:issue:`41485`)
651651

652652
.. ---------------------------------------------------------------------------
653653

pandas/core/frame.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -5568,7 +5568,7 @@ def reset_index(
55685568
) -> DataFrame | None:
55695569
...
55705570

5571-
@deprecate_nonkeyword_arguments(version="2.0", allowed_args=["self"])
5571+
@deprecate_nonkeyword_arguments(version="2.0", allowed_args=["self", "level"])
55725572
def reset_index(
55735573
self,
55745574
level: Hashable | Sequence[Hashable] | None = None,

pandas/core/generic.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1847,7 +1847,7 @@ def _drop_labels_or_levels(self, keys, axis: int = 0):
18471847
if axis == 0:
18481848
# Handle dropping index levels
18491849
if levels_to_drop:
1850-
dropped.reset_index(level=levels_to_drop, drop=True, inplace=True)
1850+
dropped.reset_index(levels_to_drop, drop=True, inplace=True)
18511851

18521852
# Handle dropping columns labels
18531853
if labels_to_drop:

pandas/core/series.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1276,7 +1276,7 @@ def repeat(self, repeats, axis=None) -> Series:
12761276
self, method="repeat"
12771277
)
12781278

1279-
@deprecate_nonkeyword_arguments(version="2.0", allowed_args=["self"])
1279+
@deprecate_nonkeyword_arguments(version="2.0", allowed_args=["self", "level"])
12801280
def reset_index(self, level=None, drop=False, name=None, inplace=False):
12811281
"""
12821282
Generate a new DataFrame or Series with the index reset.

pandas/tests/frame/methods/test_droplevel.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ def test_droplevel(self, frame_or_series):
2020
df = df.iloc[:, 0]
2121

2222
# test that dropping of a level in index works
23-
expected = df.reset_index(level="a", drop=True)
23+
expected = df.reset_index("a", drop=True)
2424
result = df.droplevel("a", axis="index")
2525
tm.assert_equal(result, expected)
2626

pandas/tests/frame/methods/test_reset_index.py

+11-11
Original file line numberDiff line numberDiff line change
@@ -142,18 +142,18 @@ def test_reset_index(self, float_frame):
142142

143143
# only remove certain columns
144144
df = float_frame.reset_index().set_index(["index", "A", "B"])
145-
rs = df.reset_index(level=["A", "B"])
145+
rs = df.reset_index(["A", "B"])
146146

147147
# TODO should reset_index check_names ?
148148
tm.assert_frame_equal(rs, float_frame, check_names=False)
149149

150-
rs = df.reset_index(level=["index", "A", "B"])
150+
rs = df.reset_index(["index", "A", "B"])
151151
tm.assert_frame_equal(rs, float_frame.reset_index(), check_names=False)
152152

153-
rs = df.reset_index(level=["index", "A", "B"])
153+
rs = df.reset_index(["index", "A", "B"])
154154
tm.assert_frame_equal(rs, float_frame.reset_index(), check_names=False)
155155

156-
rs = df.reset_index(level="A")
156+
rs = df.reset_index("A")
157157
xp = float_frame.reset_index().set_index(["index", "B"])
158158
tm.assert_frame_equal(rs, xp, check_names=False)
159159

@@ -165,7 +165,7 @@ def test_reset_index(self, float_frame):
165165
tm.assert_frame_equal(df, reset, check_names=False)
166166

167167
df = float_frame.reset_index().set_index(["index", "A", "B"])
168-
rs = df.reset_index(level="A", drop=True)
168+
rs = df.reset_index("A", drop=True)
169169
xp = float_frame.copy()
170170
del xp["A"]
171171
xp = xp.set_index(["B"], append=True)
@@ -262,23 +262,23 @@ def test_reset_index_multiindex_col(self):
262262
MultiIndex.from_arrays([[0, 1, 2], ["x", "y", "z"]], names=["d", "a"]),
263263
columns=[["b", "b", "c"], ["mean", "median", "mean"]],
264264
)
265-
rs = df.reset_index(level="a")
265+
rs = df.reset_index("a")
266266
xp = DataFrame(
267267
full,
268268
Index([0, 1, 2], name="d"),
269269
columns=[["a", "b", "b", "c"], ["", "mean", "median", "mean"]],
270270
)
271271
tm.assert_frame_equal(rs, xp)
272272

273-
rs = df.reset_index(level="a", col_fill=None)
273+
rs = df.reset_index("a", col_fill=None)
274274
xp = DataFrame(
275275
full,
276276
Index(range(3), name="d"),
277277
columns=[["a", "b", "b", "c"], ["a", "mean", "median", "mean"]],
278278
)
279279
tm.assert_frame_equal(rs, xp)
280280

281-
rs = df.reset_index(level="a", col_fill="blah", col_level=1)
281+
rs = df.reset_index("a", col_fill="blah", col_level=1)
282282
xp = DataFrame(
283283
full,
284284
Index(range(3), name="d"),
@@ -665,7 +665,7 @@ def test_reset_index_multiindex_nat():
665665
tstamp = date_range("2015-07-01", freq="D", periods=3)
666666
df = DataFrame({"id": idx, "tstamp": tstamp, "a": list("abc")})
667667
df.loc[2, "tstamp"] = pd.NaT
668-
result = df.set_index(["id", "tstamp"]).reset_index(level="id")
668+
result = df.set_index(["id", "tstamp"]).reset_index("id")
669669
expected = DataFrame(
670670
{"id": range(3), "a": list("abc")},
671671
index=pd.DatetimeIndex(["2015-07-01", "2015-07-02", "NaT"], name="tstamp"),
@@ -678,7 +678,7 @@ def test_drop_pos_args_deprecation():
678678
df = DataFrame({"a": [1, 2, 3]}).set_index("a")
679679
msg = (
680680
r"Starting with Pandas version 2\.0 all arguments of reset_index except for "
681-
r"the argument 'self' will be keyword-only"
681+
r"the arguments 'self' and 'level' will be keyword-only"
682682
)
683683
with tm.assert_produces_warning(FutureWarning, match=msg):
684-
df.reset_index("a")
684+
df.reset_index("a", False)

pandas/tests/groupby/test_grouping.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -291,7 +291,7 @@ def test_grouper_column_and_index(self):
291291

292292
# Grouping a single-index frame by a column and the index should
293293
# be equivalent to resetting the index and grouping by two columns
294-
df_single = df_multi.reset_index(level="outer")
294+
df_single = df_multi.reset_index("outer")
295295
result = df_single.groupby(["B", pd.Grouper(level="inner")]).mean()
296296
expected = df_single.reset_index().groupby(["B", "inner"]).mean()
297297
tm.assert_frame_equal(result, expected)

pandas/tests/reshape/merge/test_merge_index_as_string.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -96,11 +96,11 @@ def compute_expected(df_left, df_right, on=None, left_on=None, right_on=None, ho
9696
# Drop index levels that aren't involved in the merge
9797
drop_left = [n for n in left_levels if n not in left_on]
9898
if drop_left:
99-
df_left = df_left.reset_index(level=drop_left, drop=True)
99+
df_left = df_left.reset_index(drop_left, drop=True)
100100

101101
drop_right = [n for n in right_levels if n not in right_on]
102102
if drop_right:
103-
df_right = df_right.reset_index(level=drop_right, drop=True)
103+
df_right = df_right.reset_index(drop_right, drop=True)
104104

105105
# Convert remaining index levels to columns
106106
reset_left = [n for n in left_levels if n in left_on]

pandas/tests/series/methods/test_reset_index.py

+14-4
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ def test_reset_index_level(self):
107107
s.reset_index(level=[0, 1, 2])
108108

109109
# Check that .reset_index([],drop=True) doesn't fail
110-
result = Series(range(4)).reset_index(level=[], drop=True)
110+
result = Series(range(4)).reset_index([], drop=True)
111111
expected = Series(range(4))
112112
tm.assert_series_equal(result, expected)
113113

@@ -127,14 +127,14 @@ def test_reset_index_drop_errors(self):
127127
# KeyError raised for series index when passed level name is missing
128128
s = Series(range(4))
129129
with pytest.raises(KeyError, match="does not match index name"):
130-
s.reset_index(level="wrong", drop=True)
130+
s.reset_index("wrong", drop=True)
131131
with pytest.raises(KeyError, match="does not match index name"):
132-
s.reset_index(level="wrong")
132+
s.reset_index("wrong")
133133

134134
# KeyError raised for series when level to be dropped is missing
135135
s = Series(range(4), index=MultiIndex.from_product([[1, 2]] * 2))
136136
with pytest.raises(KeyError, match="not found"):
137-
s.reset_index(level="wrong", drop=True)
137+
s.reset_index("wrong", drop=True)
138138

139139
def test_reset_index_with_drop(self, series_with_multilevel_index):
140140
ser = series_with_multilevel_index
@@ -148,6 +148,16 @@ def test_reset_index_with_drop(self, series_with_multilevel_index):
148148
assert isinstance(deleveled, Series)
149149
assert deleveled.index.name == ser.index.name
150150

151+
def test_drop_pos_args_deprecation(self):
152+
# https://github.com/pandas-dev/pandas/issues/41485
153+
ser = Series([1, 2, 3], index=Index([1, 2, 3], name="a"))
154+
msg = (
155+
r"Starting with Pandas version 2\.0 all arguments of reset_index except "
156+
r"for the arguments 'self' and 'level' will be keyword-only"
157+
)
158+
with tm.assert_produces_warning(FutureWarning, match=msg):
159+
ser.reset_index("a", False)
160+
151161

152162
@pytest.mark.parametrize(
153163
"array, dtype",

0 commit comments

Comments
 (0)