Skip to content

Commit b0bc833

Browse files
TST: added tests for key option to series and frame sorting functions
1 parent 87dca5d commit b0bc833

File tree

3 files changed

+116
-5
lines changed

3 files changed

+116
-5
lines changed

pandas/core/series.py

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3319,6 +3319,7 @@ def sort_index(
33193319
# Validate the axis parameter
33203320
self._get_axis_number(axis)
33213321
index = self.index
3322+
true_index = index
33223323
if key is not None:
33233324
index = index.map(key)
33243325

@@ -3351,16 +3352,12 @@ def sort_index(
33513352
else:
33523353
return self.copy()
33533354

3354-
if key is not None:
3355-
key_func = np.vectorize(key)
3356-
index = key_func(index)
3357-
33583355
indexer = nargsort(
33593356
index, kind=kind, ascending=ascending, na_position=na_position
33603357
)
33613358

33623359
indexer = ensure_platform_int(indexer)
3363-
new_index = index.take(indexer)
3360+
new_index = true_index.take(indexer)
33643361
new_index = new_index._sort_levels_monotonic()
33653362

33663363
new_values = self._values.take(indexer)

pandas/tests/frame/test_sorting.py

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -570,6 +570,64 @@ def test_sort_index_categorical_index(self):
570570
expected = df.iloc[[2, 3, 0, 1, 5, 4]]
571571
assert_frame_equal(result, expected)
572572

573+
def test_sort_index_key(self):
574+
df = DataFrame(np.arange(6, dtype="int64"), index=list("aaBBca"))
575+
576+
result = df.sort_index()
577+
expected = df.iloc[[2, 3, 0, 1, 5, 4]]
578+
assert_frame_equal(result, expected)
579+
580+
result = df.sort_index(key=str.lower)
581+
expected = df.iloc[[0, 1, 5, 2, 3, 4]]
582+
assert_frame_equal(result, expected)
583+
584+
result = df.sort_index(key=str.lower, ascending=False)
585+
expected = df.iloc[[4, 2, 3, 0, 1, 5]]
586+
assert_frame_equal(result, expected)
587+
588+
@pytest.mark.parametrize('dtype', ['int8', 'int16', 'int32', 'int64', 'float32', 'float64'])
589+
def test_sort_index_key_int(self, dtype):
590+
df = DataFrame(np.arange(6, dtype=dtype), index=np.arange(6, dtype=dtype))
591+
592+
result = df.sort_index()
593+
assert_frame_equal(result, df)
594+
595+
result = df.sort_index(key=lambda x : -x)
596+
expected = df.sort_index(ascending=False)
597+
assert_frame_equal(result, expected)
598+
599+
result = df.sort_index(key=lambda x : 2 * x)
600+
assert_frame_equal(result, df)
601+
602+
def test_sort_value_key(self):
603+
df = DataFrame(np.array([0, 5, np.nan, 3, 2, np.nan]))
604+
605+
result = df.sort_values(0)
606+
expected = df.iloc[[0, 4, 3, 1, 2, 5]]
607+
assert_frame_equal(result, expected)
608+
609+
result = df.sort_values(0, key=lambda x : x + 5)
610+
expected = df.iloc[[0, 4, 3, 1, 2, 5]]
611+
assert_frame_equal(result, expected)
612+
613+
result = df.sort_values(0, key=lambda x : -x, ascending=False)
614+
expected = df.iloc[[0, 4, 3, 1, 2, 5]]
615+
assert_frame_equal(result, expected)
616+
617+
def test_sort_value_key_nan(self):
618+
df = DataFrame(np.array([["hello", "goodbye"], ["hello", "Hello"]]))
619+
620+
result = df.sort_values(1)
621+
expected = df[::-1]
622+
assert_frame_equal(result, expected)
623+
624+
result = df.sort_values([0, 1], key=str.lower)
625+
assert_frame_equal(result, df)
626+
627+
result = df.sort_values([0, 1], key=str.lower, ascending=False)
628+
expected = df.sort_values(1, key=str.lower, ascending=False)
629+
assert_frame_equal(result, expected)
630+
573631
def test_sort_index(self):
574632
# GH13496
575633

pandas/tests/series/test_sorting.py

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,62 @@ def test_sort_index_kind(self):
166166
index_sorted_series = series.sort_index(kind="heapsort")
167167
assert_series_equal(expected_series, index_sorted_series)
168168

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

0 commit comments

Comments
 (0)