Skip to content

Commit bdad488

Browse files
committed
GH14883 fix
Added searchsorted implementation to MultiIndex
1 parent dd8cba2 commit bdad488

File tree

2 files changed

+35
-1
lines changed

2 files changed

+35
-1
lines changed

pandas/indexes/multi.py

+23-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,9 @@
3232
from pandas.core.base import FrozenList
3333
import pandas.core.base as base
3434
from pandas.util.decorators import (Appender, cache_readonly,
35-
deprecate, deprecate_kwarg)
35+
deprecate, deprecate_kwarg,
36+
Substitution)
37+
3638
import pandas.core.common as com
3739
import pandas.core.missing as missing
3840
import pandas.core.algorithms as algos
@@ -1470,6 +1472,26 @@ def get_indexer(self, target, method=None, limit=None, tolerance=None):
14701472

14711473
return _ensure_platform_int(indexer)
14721474

1475+
def searchsorted(self, value, side='left', sorter=None):
1476+
ans = []
1477+
for val in value:
1478+
left_index=0
1479+
right_index=None
1480+
for dim in range(0,self.labels.__len__()):
1481+
v=self.levels[dim][self.labels[dim]]
1482+
if right_index==None: right_index=len(v)
1483+
v=v[left_index:right_index]
1484+
if (dim<self.labels.__len__()-1):
1485+
left_addition = v.searchsorted(val[dim],'left')
1486+
right_addition = v.searchsorted(val[dim],'right')
1487+
right_index=left_index+right_addition
1488+
left_index=left_index+left_addition
1489+
else:
1490+
ans.append(left_index+ v.searchsorted(val[dim],side))
1491+
return ans
1492+
1493+
1494+
14731495
def reindex(self, target, method=None, level=None, limit=None,
14741496
tolerance=None):
14751497
"""

pandas/tests/test_multilevel.py

+12
Original file line numberDiff line numberDiff line change
@@ -2448,6 +2448,18 @@ def test_iloc_mi(self):
24482448

24492449
assert_frame_equal(result, expected)
24502450

2451+
def test_searchsorted(self):
2452+
# GH 14833
2453+
# Test if MultiIndex searchsorted returns the right results for both left and right search sorted
2454+
df_mi = pd.MultiIndex([[0,1], ["a","c"]], [[0,0,1], [0,1,1]])
2455+
expected_left = list([0,1,3,1])
2456+
expected_right = list([0,1,3,2])
2457+
2458+
result_left = df_mi.searchsorted([(-1, "b"),(0,"b"),(2,"a"),(0,"c")],side='left')
2459+
result_right = df_mi.searchsorted([(-1, "b"),(0,"b"),(2,"a"),(0,"c")],side='right')
2460+
2461+
self.assertEqual(result_left,expected_left)
2462+
self.assertEqual(result_right,expected_right)
24512463

24522464
if __name__ == '__main__':
24532465
nose.runmodule(argv=[__file__, '-vvs', '-x', '--pdb', '--pdb-failure'],

0 commit comments

Comments
 (0)