Skip to content

Commit a7f1d69

Browse files
makbigcTomAugspurger
authored andcommitted
[ENH] nargsort handles EA with its _values_for_argsort (#26854)
1 parent b4aa1d6 commit a7f1d69

File tree

3 files changed

+18
-19
lines changed

3 files changed

+18
-19
lines changed

pandas/core/sorting.py

+7-10
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
11
""" miscellaneous sorting / groupby utilities """
2-
import warnings
3-
42
import numpy as np
53

64
from pandas._libs import algos, hashtable, lib
@@ -238,13 +236,15 @@ def nargsort(items, kind='quicksort', ascending=True, na_position='last'):
238236
handles NaNs. It adds ascending and na_position parameters.
239237
GH #6399, #5231
240238
"""
239+
from pandas.core.internals.arrays import extract_array
241240

241+
items = extract_array(items)
242+
mask = np.asarray(isna(items))
242243
# specially handle Categorical
243244
if is_categorical_dtype(items):
244245
if na_position not in {'first', 'last'}:
245246
raise ValueError('invalid na_position: {!r}'.format(na_position))
246247

247-
mask = isna(items)
248248
cnt_null = mask.sum()
249249
sorted_idx = items.argsort(ascending=ascending, kind=kind)
250250
if ascending and na_position == 'last':
@@ -255,15 +255,12 @@ def nargsort(items, kind='quicksort', ascending=True, na_position='last'):
255255
sorted_idx = np.roll(sorted_idx, cnt_null)
256256
return sorted_idx
257257

258-
with warnings.catch_warnings():
259-
# https://github.com/pandas-dev/pandas/issues/25439
260-
# can be removed once ExtensionArrays are properly handled by nargsort
261-
warnings.filterwarnings(
262-
"ignore", category=FutureWarning,
263-
message="Converting timezone-aware DatetimeArray to")
258+
if is_extension_array_dtype(items):
259+
items = items._values_for_argsort()
260+
else:
264261
items = np.asanyarray(items)
262+
265263
idx = np.arange(len(items))
266-
mask = isna(items)
267264
non_nans = items[~mask]
268265
non_nan_idx = idx[~mask]
269266
nan_idx = np.nonzero(mask)[0]

pandas/tests/extension/base/methods.py

+10
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import pytest
33

44
import pandas as pd
5+
from pandas.core.sorting import nargsort
56
import pandas.util.testing as tm
67

78
from .base import BaseExtensionTests
@@ -51,6 +52,15 @@ def test_argsort_missing(self, data_missing_for_sorting):
5152
expected = pd.Series(np.array([1, -1, 0], dtype=np.int64))
5253
self.assert_series_equal(result, expected)
5354

55+
@pytest.mark.parametrize('na_position, expected', [
56+
('last', np.array([2, 0, 1], dtype='int64')),
57+
('first', np.array([1, 2, 0], dtype='int64'))
58+
])
59+
def test_nargsort(self, data_missing_for_sorting, na_position, expected):
60+
# GH 25439
61+
result = nargsort(data_missing_for_sorting, na_position=na_position)
62+
tm.assert_numpy_array_equal(result, expected)
63+
5464
@pytest.mark.parametrize('ascending', [True, False])
5565
def test_sort_values(self, data_for_sorting, ascending):
5666
ser = pd.Series(data_for_sorting)

pandas/tests/test_sorting.py

+1-9
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,7 @@
66
from numpy import nan
77
import pytest
88

9-
from pandas import (
10-
DataFrame, MultiIndex, Series, array, concat, merge, to_datetime)
9+
from pandas import DataFrame, MultiIndex, Series, array, concat, merge
1110
from pandas.core import common as com
1211
from pandas.core.sorting import (
1312
decons_group_index, get_group_index, is_int64_overflow_possible,
@@ -181,13 +180,6 @@ def test_nargsort(self):
181180
exp = list(range(5)) + list(range(105, 110)) + list(range(104, 4, -1))
182181
tm.assert_numpy_array_equal(result, np.array(exp), check_dtype=False)
183182

184-
def test_nargsort_datetimearray_warning(self):
185-
# https://github.com/pandas-dev/pandas/issues/25439
186-
# can be removed once the FutureWarning for np.array(DTA) is removed
187-
data = to_datetime([0, 2, 0, 1]).tz_localize('Europe/Brussels')
188-
with tm.assert_produces_warning(None):
189-
nargsort(data)
190-
191183

192184
class TestMerge:
193185

0 commit comments

Comments
 (0)