Skip to content

Commit 277d941

Browse files
mzeitlin11luckyvs1
authored andcommitted
BUG: Ensure series/frame mode() keeps int index (pandas-dev#38732)
1 parent 9bdd9fc commit 277d941

File tree

5 files changed

+17
-3
lines changed

5 files changed

+17
-3
lines changed

doc/source/whatsnew/v1.3.0.rst

+1
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,7 @@ Numeric
210210
^^^^^^^
211211
- Bug in :meth:`DataFrame.quantile`, :meth:`DataFrame.sort_values` causing incorrect subsequent indexing behavior (:issue:`38351`)
212212
- Bug in :meth:`DataFrame.select_dtypes` with ``include=np.number`` now retains numeric ``ExtensionDtype`` columns (:issue:`35340`)
213+
- Bug in :meth:`DataFrame.mode` and :meth:`Series.mode` not keeping consistent integer :class:`Index` for empty input (:issue:`33321`)
213214

214215
Conversion
215216
^^^^^^^^^^

pandas/core/algorithms.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -928,6 +928,7 @@ def mode(values, dropna: bool = True) -> Series:
928928
mode : Series
929929
"""
930930
from pandas import Series
931+
import pandas.core.indexes.base as ibase
931932

932933
values = _ensure_arraylike(values)
933934
original = values
@@ -954,7 +955,8 @@ def mode(values, dropna: bool = True) -> Series:
954955
warn(f"Unable to sort modes: {err}")
955956

956957
result = _reconstruct_data(result, original.dtype, original)
957-
return Series(result)
958+
# Ensure index is type stable (should always use int index)
959+
return Series(result, index=ibase.default_index(len(result)))
958960

959961

960962
def rank(

pandas/core/frame.py

+6-1
Original file line numberDiff line numberDiff line change
@@ -9230,7 +9230,12 @@ def mode(
92309230
def f(s):
92319231
return s.mode(dropna=dropna)
92329232

9233-
return data.apply(f, axis=axis)
9233+
data = data.apply(f, axis=axis)
9234+
# Ensure index is type stable (should always use int index)
9235+
if data.empty:
9236+
data.index = ibase.default_index(0)
9237+
9238+
return data
92349239

92359240
def quantile(
92369241
self,

pandas/tests/frame/test_reductions.py

+6
Original file line numberDiff line numberDiff line change
@@ -669,6 +669,12 @@ def test_mode_sortwarning(self):
669669

670670
tm.assert_frame_equal(result, expected)
671671

672+
def test_mode_empty_df(self):
673+
df = DataFrame([], columns=["a", "b"])
674+
result = df.mode()
675+
expected = DataFrame([], columns=["a", "b"], index=Index([], dtype=int))
676+
tm.assert_frame_equal(result, expected)
677+
672678
def test_operators_timedelta64(self):
673679
df = DataFrame(
674680
{

pandas/tests/test_algos.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -2253,7 +2253,7 @@ def test_int64_add_overflow():
22532253

22542254
class TestMode:
22552255
def test_no_mode(self):
2256-
exp = Series([], dtype=np.float64)
2256+
exp = Series([], dtype=np.float64, index=Index([], dtype=int))
22572257
tm.assert_series_equal(algos.mode([]), exp)
22582258

22592259
def test_mode_single(self):

0 commit comments

Comments
 (0)