Skip to content

Commit 7e2f7bc

Browse files
committed
Merge pull request #6446 from jreback/iloc_tests
INT/CLN: clean up block slicing semantics
2 parents d20454e + cefb0c6 commit 7e2f7bc

File tree

2 files changed

+30
-23
lines changed

2 files changed

+30
-23
lines changed

pandas/core/internals.py

+20-11
Original file line numberDiff line numberDiff line change
@@ -2695,22 +2695,31 @@ def get_slice(self, slobj, axis=0, raise_on_error=False):
26952695
return bm
26962696

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

27002706
slicer = [slice(None, None) for _ in range(self.ndim)]
27012707
slicer[axis] = slobj
27022708
slicer = tuple(slicer)
2709+
is_unique = self.axes[0].is_unique
27032710

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

27152724
def get_series_dict(self):
27162725
# For DataFrame

pandas/tests/test_indexing.py

+10-12
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)