@@ -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 ._grouping_type = None
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 ._grouping_type = "level"
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 ._grouping_type = "categorical"
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,22 +1978,15 @@ def group_index(self):
1988
1978
return self ._group_index
1989
1979
1990
1980
def _make_labels (self ):
1991
- if self ._grouping_type in ("level" , "categorical" ): # pragma: no cover
1992
- raise Exception (
1993
- 'Should not call this method grouping by level or categorical' )
1994
- else :
1981
+ if self ._labels is None or self ._group_index is None :
1995
1982
labels , uniques = algos .factorize (self .grouper , sort = self .sort )
1996
1983
uniques = Index (uniques , name = self .name )
1997
1984
self ._labels = labels
1998
1985
self ._group_index = uniques
1999
1986
2000
- _groups = None
2001
-
2002
- @property
1987
+ @cache_readonly
2003
1988
def groups (self ):
2004
- if self ._groups is None :
2005
- self ._groups = self .index .groupby (self .grouper )
2006
- return self ._groups
1989
+ return self .index .groupby (self .grouper )
2007
1990
2008
1991
def _get_grouper (obj , key = None , axis = 0 , level = None , sort = True ):
2009
1992
"""
@@ -3239,7 +3222,7 @@ def _reindex_output(self, result):
3239
3222
return result
3240
3223
elif len (groupings ) == 1 :
3241
3224
return result
3242
- elif not any ([ping ._grouping_type == "categorical"
3225
+ elif not any ([isinstance ( ping .grouper , Categorical )
3243
3226
for ping in groupings ]):
3244
3227
return result
3245
3228
0 commit comments