Skip to content

Commit e2633d4

Browse files
author
Chang She
committed
BUG: slicing with dups #1587
1 parent 70c3deb commit e2633d4

File tree

4 files changed

+35
-5
lines changed

4 files changed

+35
-5
lines changed

pandas/core/index.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1053,6 +1053,8 @@ def slice_locs(self, start=None, end=None):
10531053
else:
10541054
try:
10551055
beg_slice = self.get_loc(start)
1056+
if isinstance(beg_slice, slice):
1057+
beg_slice = beg_slice.start
10561058
except KeyError:
10571059
if self.is_monotonic:
10581060
beg_slice = self.searchsorted(start, side='left')
@@ -1063,7 +1065,11 @@ def slice_locs(self, start=None, end=None):
10631065
end_slice = len(self)
10641066
else:
10651067
try:
1066-
end_slice = self.get_loc(end) + 1
1068+
end_slice = self.get_loc(end)
1069+
if isinstance(end_slice, slice):
1070+
end_slice = end_slice.stop
1071+
else:
1072+
end_slice += 1
10671073
except KeyError:
10681074
if self.is_monotonic:
10691075
end_slice = self.searchsorted(end, side='right')

pandas/core/indexing.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -369,10 +369,6 @@ def _convert_to_indexer(self, obj, axis=0):
369369
else:
370370
try:
371371
i, j = labels.slice_locs(start, stop)
372-
if isinstance(i, slice):
373-
i = i.start
374-
if isinstance(j, slice):
375-
j = j.stop
376372
slicer = slice(i, j, obj.step)
377373
except Exception:
378374
if _is_index_slice(obj):

pandas/tests/test_frame.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -702,6 +702,20 @@ def test_ix_multi_take_multiindex(self):
702702
xp = df.reindex(['x'], columns=[('a', '1')])
703703
assert_frame_equal(rs, xp)
704704

705+
def test_ix_dup(self):
706+
idx = Index(['a', 'a', 'b', 'c', 'd', 'd'])
707+
df = DataFrame(np.random.randn(len(idx), 3), idx)
708+
709+
sub = df.ix[:'d']
710+
assert_frame_equal(sub, df)
711+
712+
sub = df.ix['a':'c']
713+
assert_frame_equal(sub, df.ix[0:4])
714+
715+
sub = df.ix['b':'d']
716+
assert_frame_equal(sub, df.ix[2:])
717+
718+
705719
def test_getitem_fancy_1d(self):
706720
f = self.frame
707721
ix = f.ix

pandas/tests/test_index.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -397,6 +397,20 @@ def test_slice_locs(self):
397397
self.assertRaises(KeyError, idx2.slice_locs, 8, 2)
398398
self.assertRaises(KeyError, idx2.slice_locs, 7, 3)
399399

400+
def test_slice_locs_dup(self):
401+
idx = Index(['a', 'a', 'b', 'c', 'd', 'd'])
402+
rs = idx.slice_locs('a', 'd')
403+
self.assert_(rs == (0, 6))
404+
405+
rs2 = idx.slice_locs(end='d')
406+
self.assert_(rs == (0, 6))
407+
408+
rs = idx.slice_locs('a', 'c')
409+
self.assert_(rs == (0, 4))
410+
411+
rs = idx.slice_locs('b', 'd')
412+
self.assert_(rs == (2, 6))
413+
400414
def test_drop(self):
401415
n = len(self.strIndex)
402416

0 commit comments

Comments
 (0)