diff --git a/pandas/core/groupby/groupby.py b/pandas/core/groupby/groupby.py index e57e48cb3ab11..5f9b1dec062f8 100644 --- a/pandas/core/groupby/groupby.py +++ b/pandas/core/groupby/groupby.py @@ -3031,15 +3031,19 @@ def shift(self, periods=1, freq=None, axis=0, fill_value=None): if freq is not None or axis != 0: return self.apply(lambda x: x.shift(periods, freq, axis, fill_value)) - return self._get_cythonized_result( - "group_shift_indexer", - numeric_only=False, - cython_dtype=np.dtype(np.int64), - needs_ngroups=True, - result_is_index=True, - periods=periods, + ids, _, ngroups = self.grouper.group_info + res_indexer = np.zeros(len(ids), dtype=np.int64) + + libgroupby.group_shift_indexer(res_indexer, ids, ngroups, periods) + + obj = self._obj_with_exclusions + + res = obj._reindex_with_indexers( + {self.axis: (obj.axes[self.axis], res_indexer)}, fill_value=fill_value, + allow_dups=True, ) + return res @final @Substitution(name="groupby") diff --git a/pandas/tests/groupby/transform/test_transform.py b/pandas/tests/groupby/transform/test_transform.py index 6275a5440a0e2..441cbfe66f1d8 100644 --- a/pandas/tests/groupby/transform/test_transform.py +++ b/pandas/tests/groupby/transform/test_transform.py @@ -183,7 +183,7 @@ def test_transform_axis_1(request, transformation_func, using_array_manager): result = df.groupby([0, 0, 1], axis=1).transform(transformation_func, *args) expected = df.T.groupby([0, 0, 1]).transform(transformation_func, *args).T - if transformation_func == "diff": + if transformation_func in ["diff", "shift"]: # Result contains nans, so transpose coerces to float expected["b"] = expected["b"].astype("int64")