Skip to content

Commit 5d0e157

Browse files
ENH: support kind and na_position kwargs in Series.sort_index (#14445)
1 parent c0e13d1 commit 5d0e157

File tree

4 files changed

+35
-6
lines changed

4 files changed

+35
-6
lines changed

doc/source/whatsnew/v0.20.0.txt

+1
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ fixed-width text files, and :func:`read_excel` for parsing Excel files.
4747

4848
Other enhancements
4949
^^^^^^^^^^^^^^^^^^
50+
- ``Series.sort_index`` accepts parameters ``kind`` and ``na_position`` (:issue:`13589`, :issue:`14444`)
5051

5152
- ``pd.read_excel`` now preserves sheet order when using ``sheetname=None`` (:issue:`9930`)
5253

pandas/core/generic.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -2029,7 +2029,8 @@ def sort_values(self, by, axis=0, ascending=True, inplace=False,
20292029
DataFrames, this option is only applied when sorting on a single
20302030
column or label.
20312031
na_position : {'first', 'last'}, default 'last'
2032-
`first` puts NaNs at the beginning, `last` puts NaNs at the end
2032+
`first` puts NaNs at the beginning, `last` puts NaNs at the end.
2033+
Not implemented for MultiIndex.
20332034
sort_remaining : bool, default True
20342035
if true and sorting by level and index is multilevel, sort by other
20352036
levels too (in order) after sorting by specified level

pandas/core/series.py

+7-5
Original file line numberDiff line numberDiff line change
@@ -1770,7 +1770,7 @@ def _try_kind_sort(arr):
17701770

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

17751775
axis = self._get_axis_number(axis)
17761776
index = self.index
@@ -1780,11 +1780,13 @@ def sort_index(self, axis=0, level=None, ascending=True, inplace=False,
17801780
elif isinstance(index, MultiIndex):
17811781
from pandas.core.groupby import _lexsort_indexer
17821782
indexer = _lexsort_indexer(index.labels, orders=ascending)
1783-
indexer = _ensure_platform_int(indexer)
1784-
new_index = index.take(indexer)
17851783
else:
1786-
new_index, indexer = index.sort_values(return_indexer=True,
1787-
ascending=ascending)
1784+
from pandas.core.groupby import _nargsort
1785+
indexer = _nargsort(index, kind=kind, ascending=ascending,
1786+
na_position=na_position)
1787+
1788+
indexer = _ensure_platform_int(indexer)
1789+
new_index = index.take(indexer)
17881790

17891791
new_values = self._values.take(indexer)
17901792
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)