Skip to content

Commit 3625dfe

Browse files
committed
make sort=None for groupby
1 parent fa981f1 commit 3625dfe

File tree

3 files changed

+38
-12
lines changed

3 files changed

+38
-12
lines changed

pandas/core/generic.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2861,7 +2861,7 @@ def clip_lower(self, threshold):
28612861

28622862
return self.where((self >= threshold) | isnull(self), threshold)
28632863

2864-
def groupby(self, by=None, axis=0, level=None, as_index=True, sort=True,
2864+
def groupby(self, by=None, axis=0, level=None, as_index=True, sort=None,
28652865
group_keys=True, squeeze=False):
28662866
"""
28672867
Group series using mapper (dict or key function, apply given function

pandas/core/groupby.py

Lines changed: 34 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -199,19 +199,25 @@ def __new__(cls, *args, **kwargs):
199199
cls = TimeGrouper
200200
return super(Grouper, cls).__new__(cls)
201201

202-
def __init__(self, key=None, level=None, freq=None, axis=0, sort=False):
202+
def __init__(self, key=None, level=None, freq=None, axis=0, sort=None):
203203
self.key=key
204204
self.level=level
205205
self.freq=freq
206206
self.axis=axis
207-
self.sort=sort
207+
self._sort=sort
208208

209209
self.grouper=None
210210
self.obj=None
211211
self.indexer=None
212212
self.binner=None
213213
self.grouper=None
214214

215+
@property
216+
def sort(self):
217+
if self._sort is None:
218+
return True
219+
return self._sort
220+
215221
@property
216222
def ax(self):
217223
return self.grouper
@@ -233,7 +239,7 @@ def _get_grouper(self, obj):
233239
level=self.level, sort=self.sort)
234240
return self.binner, self.grouper, self.obj
235241

236-
def _set_grouper(self, obj, sort=False):
242+
def _set_grouper(self, obj, sort=None):
237243
"""
238244
given an object and the specifcations, setup the internal grouper for this particular specification
239245
@@ -359,7 +365,7 @@ class GroupBy(PandasObject):
359365

360366
def __init__(self, obj, keys=None, axis=0, level=None,
361367
grouper=None, exclusions=None, selection=None, as_index=True,
362-
sort=True, group_keys=True, squeeze=False):
368+
sort=None, group_keys=True, squeeze=False):
363369
self._selection = selection
364370

365371
if isinstance(obj, NDFrame):
@@ -375,7 +381,7 @@ def __init__(self, obj, keys=None, axis=0, level=None,
375381

376382
self.as_index = as_index
377383
self.keys = keys
378-
self.sort = sort
384+
self._sort = sort
379385
self.group_keys = group_keys
380386
self.squeeze = squeeze
381387

@@ -388,6 +394,12 @@ def __init__(self, obj, keys=None, axis=0, level=None,
388394
self.grouper = grouper
389395
self.exclusions = set(exclusions) if exclusions else set()
390396

397+
@property
398+
def sort(self):
399+
if self._sort is None:
400+
return True
401+
return self._sort
402+
391403
def __len__(self):
392404
return len(self.indices)
393405

@@ -1214,11 +1226,17 @@ class BaseGrouper(object):
12141226
This is an internal Grouper class, which actually holds the generated groups
12151227
"""
12161228

1217-
def __init__(self, axis, groupings, sort=True, group_keys=True):
1229+
def __init__(self, axis, groupings, sort=None, group_keys=True):
12181230
self._filter_empty_groups = self.compressed = len(groupings) != 1
1219-
self.axis, self.groupings, self.sort, self.group_keys = \
1231+
self.axis, self.groupings, self._sort, self.group_keys = \
12201232
axis, groupings, sort, group_keys
12211233

1234+
@property
1235+
def sort(self):
1236+
if self._sort is None:
1237+
return True
1238+
return self._sort
1239+
12221240
@property
12231241
def shape(self):
12241242
return tuple(ping.ngroups for ping in self.groupings)
@@ -1857,13 +1875,13 @@ class Grouping(object):
18571875
"""
18581876

18591877
def __init__(self, index, grouper=None, obj=None, name=None, level=None,
1860-
sort=True, in_axis=False):
1878+
sort=None, in_axis=False):
18611879

18621880
self.name = name
18631881
self.level = level
18641882
self.grouper = _convert_grouper(index, grouper)
18651883
self.index = index
1866-
self.sort = sort
1884+
self._sort = sort
18671885
self.obj = obj
18681886
self.in_axis = in_axis
18691887

@@ -1926,7 +1944,7 @@ def __init__(self, index, grouper=None, obj=None, name=None, level=None,
19261944

19271945
# must have an ordered categorical
19281946
if self.sort:
1929-
if not self.grouper.ordered:
1947+
if self._sort and not self.grouper.ordered:
19301948
raise ValueError("cannot sort by an unordered Categorical in the grouper\n"
19311949
"you can set sort=False in the groupby expression or\n"
19321950
"make the categorical ordered by using .set_ordered(True)\n")
@@ -1972,6 +1990,12 @@ def __init__(self, index, grouper=None, obj=None, name=None, level=None,
19721990
from pandas import to_timedelta
19731991
self.grouper = to_timedelta(self.grouper)
19741992

1993+
@property
1994+
def sort(self):
1995+
if self._sort is None:
1996+
return True
1997+
return self._sort
1998+
19751999
def __repr__(self):
19762000
return 'Grouping(%s)' % self.name
19772001

pandas/tests/test_groupby.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4756,7 +4756,9 @@ def test_groupby_blacklist(self):
47564756

47574757
def test_tab_completion(self):
47584758
grp = self.mframe.groupby(level='second')
4759-
results = set([v for v in dir(grp) if not v.startswith('_')])
4759+
4760+
# sort is an accessor here
4761+
results = set([v for v in dir(grp) if not v.startswith('_')])-set(['sort'])
47604762
expected = set(['A','B','C',
47614763
'agg','aggregate','apply','boxplot','filter','first','get_group',
47624764
'groups','hist','indices','last','max','mean','median',

0 commit comments

Comments
 (0)