Skip to content

Commit 4df6669

Browse files
jrebackgouthambs
authored andcommitted
INT/CLN: clean up block slicing semantics
1 parent 6317a59 commit 4df6669

File tree

2 files changed

+30
-23
lines changed

2 files changed

+30
-23
lines changed

pandas/core/internals.py

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2693,22 +2693,31 @@ def get_slice(self, slobj, axis=0, raise_on_error=False):
26932693
return bm
26942694

26952695
def _slice_blocks(self, slobj, axis):
2696-
new_blocks = []
2696+
"""
2697+
slice the blocks using the provided slice object
2698+
this is only for slicing on axis != 0
2699+
"""
2700+
2701+
if axis == 0:
2702+
raise AssertionError("cannot _slice_blocks on axis=0")
26972703

26982704
slicer = [slice(None, None) for _ in range(self.ndim)]
26992705
slicer[axis] = slobj
27002706
slicer = tuple(slicer)
2707+
is_unique = self.axes[0].is_unique
27012708

2702-
for block in self.blocks:
2703-
newb = make_block(block._slice(slicer),
2704-
block.items,
2705-
block.ref_items,
2706-
klass=block.__class__,
2707-
fastpath=True,
2708-
placement=block._ref_locs)
2709-
newb.set_ref_locs(block._ref_locs)
2710-
new_blocks.append(newb)
2711-
return new_blocks
2709+
def place(block):
2710+
if not is_unique:
2711+
return block._ref_locs
2712+
return None
2713+
2714+
return [ make_block(block._slice(slicer),
2715+
block.items,
2716+
block.ref_items,
2717+
klass=block.__class__,
2718+
fastpath=True,
2719+
placement=place(block)
2720+
) for block in self.blocks ]
27122721

27132722
def get_series_dict(self):
27142723
# For DataFrame

pandas/tests/test_indexing.py

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -380,21 +380,19 @@ def test_iloc_exceeds_bounds(self):
380380
assert_series_equal(result,expected)
381381

382382
# doc example
383-
df = DataFrame(np.random.randn(5,2),columns=list('AB'))
384-
self.assertRaises(IndexError, lambda : df.iloc[[4,5,6]])
385-
self.assertRaises(IndexError, lambda : df.iloc[:,4])
383+
def check(result,expected):
384+
str(result)
385+
result.dtypes
386+
assert_frame_equal(result,expected)
386387

387-
result = df.iloc[4:6]
388-
expected = df.iloc[[4]]
389-
assert_frame_equal(result,expected)
388+
dfl = DataFrame(np.random.randn(5,2),columns=list('AB'))
389+
check(dfl.iloc[:,2:3],DataFrame(index=dfl.index))
390+
check(dfl.iloc[:,1:3],dfl.iloc[:,[1]])
391+
check(dfl.iloc[4:6],dfl.iloc[[4]])
390392

391-
result = df.iloc[:,2:3]
392-
expected = DataFrame(index=df.index)
393-
assert_frame_equal(result,expected)
393+
self.assertRaises(IndexError, lambda : dfl.iloc[[4,5,6]])
394+
self.assertRaises(IndexError, lambda : dfl.iloc[:,4])
394395

395-
result = df.iloc[:,1:3]
396-
expected = df.iloc[:,[1]]
397-
assert_frame_equal(result,expected)
398396

399397
def test_iloc_getitem_int(self):
400398

0 commit comments

Comments
 (0)