Skip to content

Commit 8d4ee91

Browse files
committed
BUG: Sampling over selected groupbys does not reflect the selection
1 parent 57bb165 commit 8d4ee91

File tree

3 files changed

+29
-3
lines changed

3 files changed

+29
-3
lines changed

doc/source/whatsnew/v1.3.1.rst

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ Fixed regressions
2525

2626
Bug fixes
2727
~~~~~~~~~
28-
-
28+
- Bug in :meth:`DataFrame.shift` where TypeError occurred when shifting DataFrame created by concatenation of slices and fills with values (:issue:`42401`)
2929
-
3030

3131
.. ---------------------------------------------------------------------------

pandas/core/internals/managers.py

+4-2
Original file line numberDiff line numberDiff line change
@@ -386,10 +386,12 @@ def shift(self: T, periods: int, axis: int, fill_value) -> T:
386386
# We only get here with fill_value not-lib.no_default
387387
ncols = self.shape[0]
388388
if periods > 0:
389-
indexer = [-1] * periods + list(range(ncols - periods))
389+
indexer = np.concatenate(
390+
[np.repeat(-1, periods), np.arange(ncols - periods)]
391+
)
390392
else:
391393
nper = abs(periods)
392-
indexer = list(range(nper, ncols)) + [-1] * nper
394+
indexer = np.concatenate([np.arange(nper, ncols), np.repeat(-1, nper)])
393395
result = self.reindex_indexer(
394396
self.items,
395397
indexer,

pandas/tests/frame/methods/test_shift.py

+24
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,30 @@ def test_shift_axis1_multiple_blocks(self, using_array_manager):
183183

184184
tm.assert_frame_equal(result, expected)
185185

186+
# GH#42401
187+
df3 = pd.concat([df1.iloc[:4, 1:3], df2.iloc[:4, :]], axis=1)
188+
result = df3.shift(2, axis=1, fill_value=np.int_(0))
189+
if not using_array_manager:
190+
assert len(df3._mgr.blocks) == 2
191+
192+
expected = df3.take([-1, -1, 0, 1], axis=1)
193+
expected.iloc[:, :2] = np.int_(0)
194+
expected.columns = df3.columns
195+
196+
tm.assert_frame_equal(result, expected)
197+
198+
# Case with periods < 0
199+
df3 = pd.concat([df1.iloc[:4, 1:3], df2.iloc[:4, :]], axis=1)
200+
result = df3.shift(-2, axis=1, fill_value=np.int_(0))
201+
if not using_array_manager:
202+
assert len(df3._mgr.blocks) == 2
203+
204+
expected = df3.take([2, 3, -1, -1], axis=1)
205+
expected.iloc[:, -2:] = np.int_(0)
206+
expected.columns = df3.columns
207+
208+
tm.assert_frame_equal(result, expected)
209+
186210
@pytest.mark.filterwarnings("ignore:tshift is deprecated:FutureWarning")
187211
def test_tshift(self, datetime_frame):
188212
# TODO: remove this test when tshift deprecation is enforced

0 commit comments

Comments
 (0)