Skip to content

Commit a3cb4ac

Browse files
committed
DEPR: deprecate sortlevel in favor of sort_index
xref pandas-dev#14220
1 parent aa03e7f commit a3cb4ac

21 files changed

+84
-94
lines changed

doc/source/api.rst

-2
Original file line numberDiff line numberDiff line change
@@ -418,7 +418,6 @@ Reshaping, sorting
418418
Series.reorder_levels
419419
Series.sort_values
420420
Series.sort_index
421-
Series.sortlevel
422421
Series.swaplevel
423422
Series.unstack
424423
Series.searchsorted
@@ -931,7 +930,6 @@ Reshaping, sorting, transposing
931930
DataFrame.reorder_levels
932931
DataFrame.sort_values
933932
DataFrame.sort_index
934-
DataFrame.sortlevel
935933
DataFrame.nlargest
936934
DataFrame.nsmallest
937935
DataFrame.swaplevel

doc/source/whatsnew/v0.20.0.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -261,7 +261,7 @@ Deprecations
261261
- ``Categorical.searchsorted()`` and ``Series.searchsorted()`` have deprecated the ``v`` parameter in favor of ``value`` (:issue:`12662`)
262262
- ``TimedeltaIndex.searchsorted()``, ``DatetimeIndex.searchsorted()``, and ``PeriodIndex.searchsorted()`` have deprecated the ``key`` parameter in favor of ``value`` (:issue:`12662`)
263263
- ``DataFrame.astype()`` has deprecated the ``raise_on_error`` parameter in favor of ``errors`` (:issue:`14878`)
264-
264+
- ``Series.sortlevel`` and ``DataFrame.sortlevel`` have been deprecated in favor of ``Series.sort_index`` and ``DataFrame.sort_index`` (:issue:``)
265265

266266

267267
.. _whatsnew_0200.prior_deprecations:

pandas/core/frame.py

+5-1
Original file line numberDiff line numberDiff line change
@@ -1274,7 +1274,7 @@ def to_panel(self):
12741274

12751275
# minor axis must be sorted
12761276
if self.index.lexsort_depth < 2:
1277-
selfsorted = self.sortlevel(0)
1277+
selfsorted = self.sort_index(level=0)
12781278
else:
12791279
selfsorted = self
12801280

@@ -3337,6 +3337,8 @@ def sort_index(self, axis=0, level=None, ascending=True, inplace=False,
33373337
def sortlevel(self, level=0, axis=0, ascending=True, inplace=False,
33383338
sort_remaining=True):
33393339
"""
3340+
DEPRECATED: use :meth:`DataFrame.sort_index`
3341+
33403342
Sort multilevel index by chosen axis and primary level. Data will be
33413343
lexicographically sorted by the chosen level followed by the other
33423344
levels (in order)
@@ -3360,6 +3362,8 @@ def sortlevel(self, level=0, axis=0, ascending=True, inplace=False,
33603362
DataFrame.sort_index(level=...)
33613363
33623364
"""
3365+
warnings.warn("sortlevel is deprecated, use sort_index(...)",
3366+
FutureWarning, stacklevel=2)
33633367
return self.sort_index(level=level, axis=axis, ascending=ascending,
33643368
inplace=inplace, sort_remaining=sort_remaining)
33653369

pandas/core/reshape.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -375,7 +375,7 @@ def pivot_simple(index, columns, values):
375375

376376
hindex = MultiIndex.from_arrays([index, columns])
377377
series = Series(values.ravel(), index=hindex)
378-
series = series.sortlevel(0)
378+
series = series.sort_index(level=0)
379379
return series.unstack()
380380

381381

@@ -596,7 +596,7 @@ def _convert_level_number(level_num, columns):
596596
# which interferes with trying to sort based on the first
597597
# level
598598
level_to_sort = _convert_level_number(0, this.columns)
599-
this = this.sortlevel(level_to_sort, axis=1)
599+
this = this.sort_index(level=level_to_sort, axis=1)
600600

601601
# tuple list excluding level for grouping columns
602602
if len(frame.columns.levels) > 2:

pandas/core/series.py

+4
Original file line numberDiff line numberDiff line change
@@ -1988,6 +1988,8 @@ def nsmallest(self, n=5, keep='first'):
19881988

19891989
def sortlevel(self, level=0, ascending=True, sort_remaining=True):
19901990
"""
1991+
DEPRECATED: use :meth:`Series.sort_index`
1992+
19911993
Sort Series with MultiIndex by chosen level. Data will be
19921994
lexicographically sorted by the chosen level followed by the other
19931995
levels (in order)
@@ -2006,6 +2008,8 @@ def sortlevel(self, level=0, ascending=True, sort_remaining=True):
20062008
Series.sort_index(level=...)
20072009
20082010
"""
2011+
warnings.warn("sortlevel is deprecated, use sort_index(...)",
2012+
FutureWarning, stacklevel=2)
20092013
return self.sort_index(level=level, ascending=ascending,
20102014
sort_remaining=sort_remaining)
20112015

pandas/sparse/frame.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -816,7 +816,7 @@ def stack_sparse_frame(frame):
816816

817817
lp = DataFrame(stacked_values.reshape((nobs, 1)), index=index,
818818
columns=['foo'])
819-
return lp.sortlevel(level=0)
819+
return lp.sort_index(level=0)
820820

821821

822822
def homogenize(series_dict):

pandas/sparse/tests/test_series.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -947,7 +947,7 @@ def setUp(self):
947947
micol = pd.MultiIndex.from_product(
948948
[['a', 'b', 'c'], ["1", "2"]], names=['col-foo', 'col-bar'])
949949
dense_multiindex_frame = pd.DataFrame(
950-
index=miindex, columns=micol).sortlevel().sortlevel(axis=1)
950+
index=miindex, columns=micol).sort_index().sort_index(axis=1)
951951
self.dense_multiindex_frame = dense_multiindex_frame.fillna(value=3.14)
952952

953953
def test_to_sparse_preserve_multiindex_names_columns(self):

pandas/stats/plm.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -792,8 +792,8 @@ def _var_beta_panel(y, x, beta, xx, rmse, cluster_axis,
792792
resid = DataFrame(yv[:, None] - Xb, index=y.index, columns=['resid'])
793793

794794
if cluster_axis == 1:
795-
x = x.swaplevel(0, 1).sortlevel(0)
796-
resid = resid.swaplevel(0, 1).sortlevel(0)
795+
x = x.swaplevel(0, 1).sort_index(level=0)
796+
resid = resid.swaplevel(0, 1).sort_index(level=0)
797797

798798
m = _group_agg(x.values * resid.values, x.index._bounds,
799799
lambda x: np.sum(x, axis=0))

pandas/tests/frame/test_misc_api.py

-4
Original file line numberDiff line numberDiff line change
@@ -456,10 +456,6 @@ def _check_f(base, f):
456456
f = lambda x: x.sort_index(inplace=True)
457457
_check_f(data.copy(), f)
458458

459-
# sortlevel
460-
f = lambda x: x.sortlevel(0, inplace=True)
461-
_check_f(data.set_index(['a', 'b']), f)
462-
463459
# fillna
464460
f = lambda x: x.fillna(0, inplace=True)
465461
_check_f(data.copy(), f)

pandas/tests/frame/test_operators.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -467,7 +467,7 @@ def test_binary_ops_align(self):
467467

468468
df = DataFrame(np.arange(27 * 3).reshape(27, 3),
469469
index=index,
470-
columns=['value1', 'value2', 'value3']).sortlevel()
470+
columns=['value1', 'value2', 'value3']).sort_index()
471471

472472
idx = pd.IndexSlice
473473
for op in ['add', 'sub', 'mul', 'div', 'truediv']:
@@ -479,15 +479,15 @@ def test_binary_ops_align(self):
479479
result = getattr(df, op)(x, level='third', axis=0)
480480

481481
expected = pd.concat([opa(df.loc[idx[:, :, i], :], v)
482-
for i, v in x.iteritems()]).sortlevel()
482+
for i, v in x.iteritems()]).sort_index()
483483
assert_frame_equal(result, expected)
484484

485485
x = Series([1.0, 10.0], ['two', 'three'])
486486
result = getattr(df, op)(x, level='second', axis=0)
487487

488488
expected = (pd.concat([opa(df.loc[idx[:, i], :], v)
489489
for i, v in x.iteritems()])
490-
.reindex_like(df).sortlevel())
490+
.reindex_like(df).sort_index())
491491
assert_frame_equal(result, expected)
492492

493493
# GH9463 (alignment level of dataframe with series)

pandas/tests/frame/test_sorting.py

+3-13
Original file line numberDiff line numberDiff line change
@@ -53,16 +53,6 @@ def test_sort_index_multiindex(self):
5353
mi = MultiIndex.from_tuples([[2, 1, 3], [1, 1, 1]], names=list('ABC'))
5454
df = DataFrame([[1, 2], [3, 4]], mi)
5555

56-
result = df.sort_index(level='A', sort_remaining=False)
57-
expected = df.sortlevel('A', sort_remaining=False)
58-
assert_frame_equal(result, expected)
59-
60-
# sort columns by specified level of multi-index
61-
df = df.T
62-
result = df.sort_index(level='A', axis=1, sort_remaining=False)
63-
expected = df.sortlevel('A', axis=1, sort_remaining=False)
64-
assert_frame_equal(result, expected)
65-
6656
# MI sort, but no level: sort_level has no effect
6757
mi = MultiIndex.from_tuples([[1, 1, 3], [1, 1, 1]], names=list('ABC'))
6858
df = DataFrame([[1, 2], [3, 4]], mi)
@@ -453,13 +443,13 @@ def test_sort_index_duplicates(self):
453443
result = df.sort_values(by=('a', 1))
454444
assert_frame_equal(result, expected)
455445

456-
def test_sortlevel(self):
446+
def test_sort_index_level(self):
457447
mi = MultiIndex.from_tuples([[1, 1, 3], [1, 1, 1]], names=list('ABC'))
458448
df = DataFrame([[1, 2], [3, 4]], mi)
459-
res = df.sortlevel('A', sort_remaining=False)
449+
res = df.sort_index(level='A', sort_remaining=False)
460450
assert_frame_equal(df, res)
461451

462-
res = df.sortlevel(['A', 'B'], sort_remaining=False)
452+
res = df.sort_index(level=['A', 'B'], sort_remaining=False)
463453
assert_frame_equal(df, res)
464454

465455
def test_sort_datetimes(self):

pandas/tests/groupby/test_groupby.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -3427,7 +3427,7 @@ def test_int64_overflow(self):
34273427
left = lg.sum()['values']
34283428
right = rg.sum()['values']
34293429

3430-
exp_index, _ = left.index.sortlevel(0)
3430+
exp_index, _ = left.index.sortlevel()
34313431
self.assert_index_equal(left.index, exp_index)
34323432

34333433
exp_index, _ = right.index.sortlevel(0)
@@ -3708,7 +3708,7 @@ def test_more_flexible_frame_multi_function(self):
37083708
exstd = grouped.agg(OrderedDict([['C', np.std], ['D', np.std]]))
37093709

37103710
expected = concat([exmean, exstd], keys=['mean', 'std'], axis=1)
3711-
expected = expected.swaplevel(0, 1, axis=1).sortlevel(0, axis=1)
3711+
expected = expected.swaplevel(0, 1, axis=1).sort_index(level=0, axis=1)
37123712

37133713
d = OrderedDict([['C', [np.mean, np.std]], ['D', [np.mean, np.std]]])
37143714
result = grouped.aggregate(d)
@@ -4711,7 +4711,7 @@ def test_timegrouper_with_reg_groups(self):
47114711
expected = df.groupby('user_id')[
47124712
'whole_cost'].resample(
47134713
freq).sum().dropna().reorder_levels(
4714-
['date', 'user_id']).sortlevel().astype('int64')
4714+
['date', 'user_id']).sort_index().astype('int64')
47154715
expected.name = 'whole_cost'
47164716

47174717
result1 = df.sort_index().groupby([pd.TimeGrouper(freq=freq),

pandas/tests/indexes/test_multi.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -440,7 +440,7 @@ def test_set_value_keeps_names(self):
440440
np.random.randn(6, 4),
441441
columns=['one', 'two', 'three', 'four'],
442442
index=idx)
443-
df = df.sortlevel()
443+
df = df.sort_index()
444444
self.assertIsNone(df.is_copy)
445445
self.assertEqual(df.index.names, ('Name', 'Number'))
446446
df = df.set_value(('grethe', '4'), 'one', 99.34)

pandas/tests/indexing/test_indexing.py

+16-16
Original file line numberDiff line numberDiff line change
@@ -2104,7 +2104,7 @@ def test_ix_general(self):
21042104
tm.assert_frame_equal(df.ix[key], df.iloc[2:])
21052105

21062106
# this is ok
2107-
df.sortlevel(inplace=True)
2107+
df.sort_index(inplace=True)
21082108
res = df.ix[key]
21092109
# col has float dtype, result should be Float64Index
21102110
index = MultiIndex.from_arrays([[4.] * 3, [2012] * 3],
@@ -2137,7 +2137,7 @@ def test_xs_multiindex(self):
21372137
[('a', 'foo'), ('a', 'bar'), ('b', 'hello'),
21382138
('b', 'world')], names=['lvl0', 'lvl1'])
21392139
df = DataFrame(np.random.randn(4, 4), columns=columns)
2140-
df.sortlevel(axis=1, inplace=True)
2140+
df.sort_index(axis=1, inplace=True)
21412141
result = df.xs('a', level='lvl0', axis=1)
21422142
expected = df.iloc[:, 0:2].loc[:, 'a']
21432143
tm.assert_frame_equal(result, expected)
@@ -2180,7 +2180,7 @@ def test_per_axis_per_level_getitem(self):
21802180
df = DataFrame(
21812181
np.arange(16, dtype='int64').reshape(
21822182
4, 4), index=index, columns=columns)
2183-
df = df.sortlevel(axis=0).sortlevel(axis=1)
2183+
df = df.sort_index(axis=0).sort_index(axis=1)
21842184

21852185
# identity
21862186
result = df.loc[(slice(None), slice(None)), :]
@@ -2249,7 +2249,7 @@ def f():
22492249

22502250
# not lexsorted
22512251
self.assertEqual(df.index.lexsort_depth, 2)
2252-
df = df.sortlevel(level=1, axis=0)
2252+
df = df.sort_index(level=1, axis=0)
22532253
self.assertEqual(df.index.lexsort_depth, 0)
22542254
with tm.assertRaisesRegexp(
22552255
UnsortedIndexError,
@@ -2265,11 +2265,11 @@ def test_multiindex_slicers_non_unique(self):
22652265
B=['a', 'a', 'a', 'a'],
22662266
C=[1, 2, 1, 3],
22672267
D=[1, 2, 3, 4]))
2268-
.set_index(['A', 'B', 'C']).sortlevel())
2268+
.set_index(['A', 'B', 'C']).sort_index())
22692269
self.assertFalse(df.index.is_unique)
22702270
expected = (DataFrame(dict(A=['foo', 'foo'], B=['a', 'a'],
22712271
C=[1, 1], D=[1, 3]))
2272-
.set_index(['A', 'B', 'C']).sortlevel())
2272+
.set_index(['A', 'B', 'C']).sort_index())
22732273
result = df.loc[(slice(None), slice(None), 1), :]
22742274
tm.assert_frame_equal(result, expected)
22752275

@@ -2281,11 +2281,11 @@ def test_multiindex_slicers_non_unique(self):
22812281
B=['a', 'a', 'a', 'a'],
22822282
C=[1, 2, 1, 2],
22832283
D=[1, 2, 3, 4]))
2284-
.set_index(['A', 'B', 'C']).sortlevel())
2284+
.set_index(['A', 'B', 'C']).sort_index())
22852285
self.assertFalse(df.index.is_unique)
22862286
expected = (DataFrame(dict(A=['foo', 'foo'], B=['a', 'a'],
22872287
C=[1, 1], D=[1, 3]))
2288-
.set_index(['A', 'B', 'C']).sortlevel())
2288+
.set_index(['A', 'B', 'C']).sort_index())
22892289
result = df.loc[(slice(None), slice(None), 1), :]
22902290
self.assertFalse(result.index.is_unique)
22912291
tm.assert_frame_equal(result, expected)
@@ -2357,7 +2357,7 @@ def test_multiindex_slicers_edges(self):
23572357

23582358
df['DATE'] = pd.to_datetime(df['DATE'])
23592359
df1 = df.set_index(['A', 'B', 'DATE'])
2360-
df1 = df1.sortlevel()
2360+
df1 = df1.sort_index()
23612361

23622362
# A1 - Get all values under "A0" and "A1"
23632363
result = df1.loc[(slice('A1')), :]
@@ -2440,7 +2440,7 @@ def f():
24402440
df.loc['A1', (slice(None), 'foo')]
24412441

24422442
self.assertRaises(UnsortedIndexError, f)
2443-
df = df.sortlevel(axis=1)
2443+
df = df.sort_index(axis=1)
24442444

24452445
# slicing
24462446
df.loc['A1', (slice(None), 'foo')]
@@ -2459,7 +2459,7 @@ def test_loc_axis_arguments(self):
24592459
df = DataFrame(np.arange(len(index) * len(columns), dtype='int64')
24602460
.reshape((len(index), len(columns))),
24612461
index=index,
2462-
columns=columns).sortlevel().sortlevel(axis=1)
2462+
columns=columns).sort_index().sort_index(axis=1)
24632463

24642464
# axis 0
24652465
result = df.loc(axis=0)['A1':'A3', :, ['C1', 'C3']]
@@ -2551,7 +2551,7 @@ def test_per_axis_per_level_setitem(self):
25512551
df_orig = DataFrame(
25522552
np.arange(16, dtype='int64').reshape(
25532553
4, 4), index=index, columns=columns)
2554-
df_orig = df_orig.sortlevel(axis=0).sortlevel(axis=1)
2554+
df_orig = df_orig.sort_index(axis=0).sort_index(axis=1)
25552555

25562556
# identity
25572557
df = df_orig.copy()
@@ -2764,12 +2764,12 @@ def f():
27642764
idx = pd.MultiIndex.from_product([['A', 'B', 'C'],
27652765
['foo', 'bar', 'baz']],
27662766
names=['one', 'two'])
2767-
s = pd.Series(np.arange(9, dtype='int64'), index=idx).sortlevel()
2767+
s = pd.Series(np.arange(9, dtype='int64'), index=idx).sort_index()
27682768

27692769
exp_idx = pd.MultiIndex.from_product([['A'], ['foo', 'bar', 'baz']],
27702770
names=['one', 'two'])
27712771
expected = pd.Series(np.arange(3, dtype='int64'),
2772-
index=exp_idx).sortlevel()
2772+
index=exp_idx).sort_index()
27732773

27742774
result = s.loc[['A']]
27752775
tm.assert_series_equal(result, expected)
@@ -2786,7 +2786,7 @@ def f():
27862786

27872787
idx = pd.IndexSlice
27882788
expected = pd.Series([0, 3, 6], index=pd.MultiIndex.from_product(
2789-
[['A', 'B', 'C'], ['foo']], names=['one', 'two'])).sortlevel()
2789+
[['A', 'B', 'C'], ['foo']], names=['one', 'two'])).sort_index()
27902790

27912791
result = s.loc[idx[:, ['foo']]]
27922792
tm.assert_series_equal(result, expected)
@@ -2799,7 +2799,7 @@ def f():
27992799
['alpha', 'beta']))
28002800
df = DataFrame(
28012801
np.random.randn(5, 6), index=range(5), columns=multi_index)
2802-
df = df.sortlevel(0, axis=1)
2802+
df = df.sort_index(level=0, axis=1)
28032803

28042804
expected = DataFrame(index=range(5),
28052805
columns=multi_index.reindex([])[0])

pandas/tests/series/test_analytics.py

+7-6
Original file line numberDiff line numberDiff line change
@@ -1595,21 +1595,21 @@ def test_nsmallest_nlargest(self):
15951595
expected = s.sort_values().head(3)
15961596
assert_series_equal(result, expected)
15971597

1598-
def test_sortlevel(self):
1598+
def test_sort_index_level(self):
15991599
mi = MultiIndex.from_tuples([[1, 1, 3], [1, 1, 1]], names=list('ABC'))
16001600
s = Series([1, 2], mi)
16011601
backwards = s.iloc[[1, 0]]
16021602

1603-
res = s.sortlevel('A')
1603+
res = s.sort_index(level='A')
16041604
assert_series_equal(backwards, res)
16051605

1606-
res = s.sortlevel(['A', 'B'])
1606+
res = s.sort_index(level=['A', 'B'])
16071607
assert_series_equal(backwards, res)
16081608

1609-
res = s.sortlevel('A', sort_remaining=False)
1609+
res = s.sort_index(level='A', sort_remaining=False)
16101610
assert_series_equal(s, res)
16111611

1612-
res = s.sortlevel(['A', 'B'], sort_remaining=False)
1612+
res = s.sort_index(level=['A', 'B'], sort_remaining=False)
16131613
assert_series_equal(s, res)
16141614

16151615
def test_apply_categorical(self):
@@ -1738,7 +1738,8 @@ def test_unstack(self):
17381738
s = Series(np.random.randn(6), index=index)
17391739
exp_index = MultiIndex(levels=[['one', 'two', 'three'], [0, 1]],
17401740
labels=[[0, 1, 2, 0, 1, 2], [0, 1, 0, 1, 0, 1]])
1741-
expected = DataFrame({'bar': s.values}, index=exp_index).sortlevel(0)
1741+
expected = DataFrame({'bar': s.values},
1742+
index=exp_index).sort_index(level=0)
17421743
unstacked = s.unstack(0)
17431744
assert_frame_equal(unstacked, expected)
17441745

0 commit comments

Comments
 (0)