Skip to content

Commit 33186c8

Browse files
committed
BUG: DataFrame.shift shows different behavior for axis=1 when freq is specified
1 parent 1ce2166 commit 33186c8

File tree

3 files changed

+18
-1
lines changed

3 files changed

+18
-1
lines changed

doc/source/whatsnew/v1.5.0.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -780,6 +780,7 @@ Indexing
780780
- Bug in setting large integer values into :class:`Series` with ``float32`` or ``float16`` dtype incorrectly altering these values instead of coercing to ``float64`` dtype (:issue:`45844`)
781781
- Bug in :meth:`Series.asof` and :meth:`DataFrame.asof` incorrectly casting bool-dtype results to ``float64`` dtype (:issue:`16063`)
782782
- Bug in :meth:`NDFrame.xs`, :meth:`DataFrame.iterrows`, :meth:`DataFrame.loc` and :meth:`DataFrame.iloc` not always propagating metadata (:issue:`28283`)
783+
- Bug in :meth:`DataFrame.shift` when ``axis`` is ``columns`` and ``fill_value`` is absent, ``freq`` is ignored (:issue:`47039`)
783784
-
784785

785786
Missing

pandas/core/frame.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5507,7 +5507,13 @@ def shift(
55075507
axis = self._get_axis_number(axis)
55085508

55095509
ncols = len(self.columns)
5510-
if axis == 1 and periods != 0 and fill_value is lib.no_default and ncols > 0:
5510+
if (
5511+
axis == 1
5512+
and periods != 0
5513+
and freq is None
5514+
and fill_value is lib.no_default
5515+
and ncols > 0
5516+
):
55115517
# We will infer fill_value to match the closest column
55125518

55135519
# Use a column that we know is valid for our column's dtype GH#38434

pandas/tests/frame/methods/test_shift.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,16 @@ def test_shift_named_axis(self):
259259
result = df.shift(1, axis="columns")
260260
tm.assert_frame_equal(result, expected)
261261

262+
def test_shift_other_axis_with_freq(self, datetime_frame):
263+
obj = datetime_frame.T
264+
offset = offsets.BDay()
265+
266+
# GH#47039
267+
shifted = obj.shift(5, freq=offset, axis=1)
268+
assert len(shifted) == len(obj)
269+
unshifted = shifted.shift(-5, freq=offset, axis=1)
270+
tm.assert_equal(unshifted, obj)
271+
262272
def test_shift_bool(self):
263273
df = DataFrame({"high": [True, False], "low": [False, False]})
264274
rs = df.shift(1)

0 commit comments

Comments
 (0)