@@ -1862,7 +1862,6 @@ def __init__(self, index, grouper=None, obj=None, name=None, level=None,
1862
1862
self .grouper = grouper .values
1863
1863
1864
1864
# pre-computed
1865
- self ._was_factor = False
1866
1865
self ._should_compress = True
1867
1866
1868
1867
# we have a single grouper which may be a myriad of things, some of which are
@@ -1887,8 +1886,6 @@ def __init__(self, index, grouper=None, obj=None, name=None, level=None,
1887
1886
level_values = index .levels [level ].take (inds )
1888
1887
self .grouper = level_values .map (self .grouper )
1889
1888
else :
1890
- self ._was_factor = True
1891
-
1892
1889
# all levels may not be observed
1893
1890
labels , uniques = algos .factorize (inds , sort = True )
1894
1891
@@ -1913,17 +1910,10 @@ def __init__(self, index, grouper=None, obj=None, name=None, level=None,
1913
1910
1914
1911
# a passed Categorical
1915
1912
elif isinstance (self .grouper , Categorical ):
1916
-
1917
- factor = self .grouper
1918
- self ._was_factor = True
1919
-
1920
- # Is there any way to avoid this?
1921
- self .grouper = np .asarray (factor )
1922
-
1923
- self ._labels = factor .codes
1924
- self ._group_index = factor .categories
1913
+ self ._labels = self .grouper .codes
1914
+ self ._group_index = self .grouper .categories
1925
1915
if self .name is None :
1926
- self .name = factor .name
1916
+ self .name = self . grouper .name
1927
1917
1928
1918
# a passed Grouper like
1929
1919
elif isinstance (self .grouper , Grouper ):
@@ -1936,8 +1926,8 @@ def __init__(self, index, grouper=None, obj=None, name=None, level=None,
1936
1926
self .name = grouper .name
1937
1927
1938
1928
# no level passed
1939
- if not isinstance (self .grouper , (Series , Index , np .ndarray )):
1940
- if getattr (self .grouper ,'ndim' , 1 ) != 1 :
1929
+ if not isinstance (self .grouper , (Series , Index , Categorical , np .ndarray )):
1930
+ if getattr (self .grouper , 'ndim' , 1 ) != 1 :
1941
1931
t = self .name or str (type (self .grouper ))
1942
1932
raise ValueError ("Grouper for '%s' not 1-dimensional" % t )
1943
1933
self .grouper = self .index .map (self .grouper )
@@ -1988,21 +1978,15 @@ def group_index(self):
1988
1978
return self ._group_index
1989
1979
1990
1980
def _make_labels (self ):
1991
- if self ._was_factor : # pragma: no cover
1992
- raise Exception ('Should not call this method grouping by level' )
1993
- else :
1981
+ if self ._labels is None or self ._group_index is None :
1994
1982
labels , uniques = algos .factorize (self .grouper , sort = self .sort )
1995
1983
uniques = Index (uniques , name = self .name )
1996
1984
self ._labels = labels
1997
1985
self ._group_index = uniques
1998
1986
1999
- _groups = None
2000
-
2001
- @property
1987
+ @cache_readonly
2002
1988
def groups (self ):
2003
- if self ._groups is None :
2004
- self ._groups = self .index .groupby (self .grouper )
2005
- return self ._groups
1989
+ return self .index .groupby (self .grouper )
2006
1990
2007
1991
def _get_grouper (obj , key = None , axis = 0 , level = None , sort = True ):
2008
1992
"""
@@ -3238,10 +3222,11 @@ def _reindex_output(self, result):
3238
3222
return result
3239
3223
elif len (groupings ) == 1 :
3240
3224
return result
3241
- elif not any ([ping ._was_factor for ping in groupings ]):
3225
+ elif not any ([isinstance (ping .grouper , Categorical )
3226
+ for ping in groupings ]):
3242
3227
return result
3243
3228
3244
- levels_list = [ ping ._group_index for ping in groupings ]
3229
+ levels_list = [ ping .group_index for ping in groupings ]
3245
3230
index = MultiIndex .from_product (levels_list , names = self .grouper .names )
3246
3231
d = { self .obj ._get_axis_name (self .axis ) : index , 'copy' : False }
3247
3232
return result .reindex (** d ).sortlevel (axis = self .axis )
0 commit comments