Skip to content

Commit af949fd

Browse files
TST: added tests for key option to series and frame sorting functions
1 parent 5893f95 commit af949fd

File tree

3 files changed

+116
-5
lines changed

3 files changed

+116
-5
lines changed

pandas/core/series.py

+2-5
Original file line numberDiff line numberDiff line change
@@ -3134,6 +3134,7 @@ def sort_index(
31343134
# Validate the axis parameter
31353135
self._get_axis_number(axis)
31363136
index = self.index
3137+
true_index = index
31373138
if key is not None:
31383139
index = index.map(key)
31393140

@@ -3166,16 +3167,12 @@ def sort_index(
31663167
else:
31673168
return self.copy()
31683169

3169-
if key is not None:
3170-
key_func = np.vectorize(key)
3171-
index = key_func(index)
3172-
31733170
indexer = nargsort(
31743171
index, kind=kind, ascending=ascending, na_position=na_position
31753172
)
31763173

31773174
indexer = ensure_platform_int(indexer)
3178-
new_index = index.take(indexer)
3175+
new_index = true_index.take(indexer)
31793176
new_index = new_index._sort_levels_monotonic()
31803177

31813178
new_values = self._values.take(indexer)

pandas/tests/frame/test_sorting.py

+58
Original file line numberDiff line numberDiff line change
@@ -500,6 +500,64 @@ def test_sort_index_categorical_index(self):
500500
expected = df.iloc[[2, 3, 0, 1, 5, 4]]
501501
tm.assert_frame_equal(result, expected)
502502

503+
def test_sort_index_key(self):
504+
df = DataFrame(np.arange(6, dtype="int64"), index=list("aaBBca"))
505+
506+
result = df.sort_index()
507+
expected = df.iloc[[2, 3, 0, 1, 5, 4]]
508+
assert_frame_equal(result, expected)
509+
510+
result = df.sort_index(key=str.lower)
511+
expected = df.iloc[[0, 1, 5, 2, 3, 4]]
512+
assert_frame_equal(result, expected)
513+
514+
result = df.sort_index(key=str.lower, ascending=False)
515+
expected = df.iloc[[4, 2, 3, 0, 1, 5]]
516+
assert_frame_equal(result, expected)
517+
518+
@pytest.mark.parametrize('dtype', ['int8', 'int16', 'int32', 'int64', 'float32', 'float64'])
519+
def test_sort_index_key_int(self, dtype):
520+
df = DataFrame(np.arange(6, dtype=dtype), index=np.arange(6, dtype=dtype))
521+
522+
result = df.sort_index()
523+
assert_frame_equal(result, df)
524+
525+
result = df.sort_index(key=lambda x : -x)
526+
expected = df.sort_index(ascending=False)
527+
assert_frame_equal(result, expected)
528+
529+
result = df.sort_index(key=lambda x : 2 * x)
530+
assert_frame_equal(result, df)
531+
532+
def test_sort_value_key(self):
533+
df = DataFrame(np.array([0, 5, np.nan, 3, 2, np.nan]))
534+
535+
result = df.sort_values(0)
536+
expected = df.iloc[[0, 4, 3, 1, 2, 5]]
537+
assert_frame_equal(result, expected)
538+
539+
result = df.sort_values(0, key=lambda x : x + 5)
540+
expected = df.iloc[[0, 4, 3, 1, 2, 5]]
541+
assert_frame_equal(result, expected)
542+
543+
result = df.sort_values(0, key=lambda x : -x, ascending=False)
544+
expected = df.iloc[[0, 4, 3, 1, 2, 5]]
545+
assert_frame_equal(result, expected)
546+
547+
def test_sort_value_key_nan(self):
548+
df = DataFrame(np.array([["hello", "goodbye"], ["hello", "Hello"]]))
549+
550+
result = df.sort_values(1)
551+
expected = df[::-1]
552+
assert_frame_equal(result, expected)
553+
554+
result = df.sort_values([0, 1], key=str.lower)
555+
assert_frame_equal(result, df)
556+
557+
result = df.sort_values([0, 1], key=str.lower, ascending=False)
558+
expected = df.sort_values(1, key=str.lower, ascending=False)
559+
assert_frame_equal(result, expected)
560+
503561
def test_sort_index(self):
504562
# GH13496
505563

pandas/tests/series/test_sorting.py

+56
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,62 @@ def test_sort_index_kind(self):
169169
index_sorted_series = series.sort_index(kind="heapsort")
170170
tm.assert_series_equal(expected_series, index_sorted_series)
171171

172+
def test_sort_index_key(self):
173+
series = Series(np.arange(6, dtype="int64"), index=list("aaBBca"))
174+
175+
result = series.sort_index()
176+
expected = series.iloc[[2, 3, 0, 1, 5, 4]]
177+
assert_series_equal(result, expected)
178+
179+
result = series.sort_index(key=str.lower)
180+
expected = series.iloc[[0, 1, 5, 2, 3, 4]]
181+
assert_series_equal(result, expected)
182+
183+
result = series.sort_index(key=str.lower, ascending=False)
184+
expected = series.iloc[[4, 2, 3, 0, 1, 5]]
185+
assert_series_equal(result, expected)
186+
187+
@pytest.mark.parametrize('dtype', ['int8', 'int16', 'int32', 'int64', 'float32', 'float64'])
188+
def test_sort_index_key_int(self, dtype):
189+
series = Series(np.arange(6, dtype=dtype), index=np.arange(6, dtype=dtype))
190+
191+
result = series.sort_index()
192+
assert_series_equal(result, series)
193+
194+
result = series.sort_index(key=lambda x : -x)
195+
expected = series.sort_index(ascending=False)
196+
assert_series_equal(result, expected)
197+
198+
result = series.sort_index(key=lambda x: 2 * x)
199+
assert_series_equal(result, series)
200+
201+
202+
def test_sort_value_key(self):
203+
series = Series(np.array(["Hello", "goodbye"]))
204+
205+
result = series.sort_values(0)
206+
expected = series
207+
assert_series_equal(result, expected)
208+
209+
result = series.sort_values(0, key=str.lower)
210+
expected = series[::-1]
211+
assert_series_equal(result, expected)
212+
213+
def test_sort_value_key_nan(self):
214+
series = Series(np.array([0, 5, np.nan, 3, 2, np.nan]))
215+
216+
result = series.sort_values(0)
217+
expected = series.iloc[[0, 4, 3, 1, 2, 5]]
218+
assert_series_equal(result, expected)
219+
220+
result = series.sort_values(0, key=lambda x: x + 5)
221+
expected = series.iloc[[0, 4, 3, 1, 2, 5]]
222+
assert_series_equal(result, expected)
223+
224+
result = series.sort_values(0, key=lambda x: -x, ascending=False)
225+
expected = series.iloc[[0, 4, 3, 1, 2, 5]]
226+
assert_series_equal(result, expected)
227+
172228
def test_sort_index_na_position(self):
173229
series = Series(index=[3, 2, 1, 4, 3, np.nan])
174230

0 commit comments

Comments
 (0)