Skip to content

Commit 4dff9c3

Browse files
committed
Changes
1 parent dd72723 commit 4dff9c3

File tree

3 files changed

+19
-2
lines changed

3 files changed

+19
-2
lines changed

doc/source/whatsnew/v1.1.0.rst

+3-1
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,9 @@ Other API changes
137137
Backwards incompatible API changes
138138
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
139139
- :meth:`DataFrame.swaplevels` now raises a ``TypeError`` if the axis is not a :class:`MultiIndex`.
140-
Previously a ``AttributeError`` was raised (:issue:`31126`)
140+
Previously an ``AttributeError`` was raised (:issue:`31126`)
141+
- :meth:`DataFrame.xs` now raises a ``TypeError`` if a ``level`` keyword is supplied and the axis is not a :class:`MultiIndex`.
142+
Previously an ``AttributeError`` was raised (:issue:`33610`)
141143
- :meth:`DataFrameGroupby.mean` and :meth:`SeriesGroupby.mean` (and similarly for :meth:`~DataFrameGroupby.median`, :meth:`~DataFrameGroupby.std` and :meth:`~DataFrameGroupby.var`)
142144
now raise a ``TypeError`` if a not-accepted keyword argument is passed into it.
143145
Previously a ``UnsupportedFunctionCall`` was raised (``AssertionError`` if ``min_count`` passed into :meth:`~DataFrameGroupby.median`) (:issue:`31485`)

pandas/core/generic.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -590,6 +590,8 @@ def swapaxes(self: FrameOrSeries, axis1, axis2, copy=True) -> FrameOrSeries:
590590
if copy:
591591
new_values = new_values.copy()
592592

593+
# ignore needed because of NDFrame constructor is different than
594+
# DataFrame/Series constructors.
593595
return self._constructor(new_values, *new_axes).__finalize__( # type: ignore
594596
self, method="swapaxes"
595597
)
@@ -3490,7 +3492,8 @@ class animal locomotion
34903492
axis = self._get_axis_number(axis)
34913493
labels = self._get_axis(axis)
34923494
if level is not None:
3493-
assert isinstance(labels, MultiIndex), type(labels)
3495+
if not isinstance(labels, MultiIndex):
3496+
raise TypeError("Index must be a MultiIndex")
34943497
loc, new_ax = labels.get_loc_level(key, level=level, drop_level=drop_level)
34953498

34963499
# create the tuple of the indexer

pandas/tests/indexing/multiindex/test_xs.py

+12
Original file line numberDiff line numberDiff line change
@@ -243,3 +243,15 @@ def test_series_getitem_multiindex_xs_by_label():
243243

244244
result = s.xs("one", level="L2")
245245
tm.assert_series_equal(result, expected)
246+
247+
248+
def test_xs_levels_raises():
249+
df = DataFrame({"A": [1, 2, 3]})
250+
251+
msg = "Index must be a MultiIndex"
252+
with pytest.raises(TypeError, match=msg):
253+
df.xs(0, level="as")
254+
255+
s = df.A
256+
with pytest.raises(TypeError, match=msg):
257+
s.xs(0, level="as")

0 commit comments

Comments
 (0)