Skip to content

Commit 5cade34

Browse files
BUG Series.sort_index does not accept parameters kind and na_position
1 parent 7cad3f1 commit 5cade34

File tree

3 files changed

+39
-3
lines changed

3 files changed

+39
-3
lines changed

doc/source/whatsnew/v0.19.1.txt

+1
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ Bug Fixes
3737
- Bug in localizing an ambiguous timezone when a boolean is passed (:issue:`14402`)
3838

3939

40+
- Bug in ``Series.sort_index`` where parameters ``kind`` and ``na_position`` did not exist (:issue:`13589`, :issue:`14444`)
4041

4142

4243

pandas/core/series.py

+13-3
Original file line numberDiff line numberDiff line change
@@ -1773,7 +1773,7 @@ def _try_kind_sort(arr):
17731773

17741774
@Appender(generic._shared_docs['sort_index'] % _shared_doc_kwargs)
17751775
def sort_index(self, axis=0, level=None, ascending=True, inplace=False,
1776-
sort_remaining=True):
1776+
kind='quicksort', na_position='last', sort_remaining=True):
17771777

17781778
axis = self._get_axis_number(axis)
17791779
index = self.index
@@ -1786,8 +1786,18 @@ def sort_index(self, axis=0, level=None, ascending=True, inplace=False,
17861786
indexer = _ensure_platform_int(indexer)
17871787
new_index = index.take(indexer)
17881788
else:
1789-
new_index, indexer = index.sort_values(return_indexer=True,
1790-
ascending=ascending)
1789+
from pandas.core.groupby import _nargsort
1790+
1791+
if ((ascending and index.is_monotonic_increasing) or
1792+
(not ascending and index.is_monotonic_decreasing)):
1793+
if inplace:
1794+
return
1795+
else:
1796+
return self.copy()
1797+
1798+
indexer = _nargsort(index, kind=kind, ascending=ascending,
1799+
na_position=na_position)
1800+
new_index = index.take(indexer)
17911801

17921802
new_values = self._values.take(indexer)
17931803
result = self._constructor(new_values, index=new_index)

pandas/tests/series/test_sorting.py

+25
Original file line numberDiff line numberDiff line change
@@ -144,3 +144,28 @@ def test_sort_index_multiindex(self):
144144
# rows share same level='A': sort has no effect without remaining lvls
145145
res = s.sort_index(level='A', sort_remaining=False)
146146
assert_series_equal(s, res)
147+
148+
def test_sort_index_kind(self):
149+
# GH #14444 & #13589: Add support for sort algo choosing
150+
series = Series(index=[3, 2, 1, 4, 3])
151+
expected_series = Series(index=[1, 2, 3, 3, 4])
152+
153+
index_sorted_series = series.sort_index(kind='mergesort')
154+
assert_series_equal(expected_series, index_sorted_series)
155+
156+
index_sorted_series = series.sort_index(kind='quicksort')
157+
assert_series_equal(expected_series, index_sorted_series)
158+
159+
index_sorted_series = series.sort_index(kind='heapsort')
160+
assert_series_equal(expected_series, index_sorted_series)
161+
162+
def test_sort_index_na_position(self):
163+
series = Series(index=[3, 2, 1, 4, 3, np.nan])
164+
165+
expected_series_first = Series(index=[np.nan, 1, 2, 3, 3, 4])
166+
index_sorted_series = series.sort_index(na_position='first')
167+
assert_series_equal(expected_series_first, index_sorted_series)
168+
169+
expected_series_last = Series(index=[1, 2, 3, 3, 4, np.nan])
170+
index_sorted_series = series.sort_index(na_position='last')
171+
assert_series_equal(expected_series_last, index_sorted_series)

0 commit comments

Comments
 (0)