@@ -688,9 +688,9 @@ def describe(self, **kwargs):
688
688
689
689
def value_counts (
690
690
self ,
691
- normalize = False ,
692
- sort = True ,
693
- ascending = False ,
691
+ normalize : bool = False ,
692
+ sort : bool = True ,
693
+ ascending : bool = False ,
694
694
bins = None ,
695
695
dropna : bool = True ,
696
696
):
@@ -715,7 +715,7 @@ def apply_series_value_counts():
715
715
# scalar bins cannot be done at top level
716
716
# in a backward compatible way
717
717
return apply_series_value_counts ()
718
- elif is_categorical_dtype (val ):
718
+ elif is_categorical_dtype (val . dtype ):
719
719
# GH38672
720
720
return apply_series_value_counts ()
721
721
@@ -807,44 +807,36 @@ def apply_series_value_counts():
807
807
sorter = np .lexsort ((out if ascending else - out , cat ))
808
808
out , codes [- 1 ] = out [sorter ], codes [- 1 ][sorter ]
809
809
810
- if bins is None :
811
- mi = MultiIndex (
812
- levels = levels , codes = codes , names = names , verify_integrity = False
813
- )
814
-
815
- if is_integer_dtype (out ):
816
- out = ensure_int64 (out )
817
- return self .obj ._constructor (out , index = mi , name = self ._selection_name )
818
-
819
- # for compat. with libgroupby.value_counts need to ensure every
820
- # bin is present at every index level, null filled with zeros
821
- diff = np .zeros (len (out ), dtype = "bool" )
822
- for level_codes in codes [:- 1 ]:
823
- diff |= np .r_ [True , level_codes [1 :] != level_codes [:- 1 ]]
810
+ if bins is not None :
811
+ # for compat. with libgroupby.value_counts need to ensure every
812
+ # bin is present at every index level, null filled with zeros
813
+ diff = np .zeros (len (out ), dtype = "bool" )
814
+ for level_codes in codes [:- 1 ]:
815
+ diff |= np .r_ [True , level_codes [1 :] != level_codes [:- 1 ]]
824
816
825
- ncat , nbin = diff .sum (), len (levels [- 1 ])
817
+ ncat , nbin = diff .sum (), len (levels [- 1 ])
826
818
827
- left = [np .repeat (np .arange (ncat ), nbin ), np .tile (np .arange (nbin ), ncat )]
819
+ left = [np .repeat (np .arange (ncat ), nbin ), np .tile (np .arange (nbin ), ncat )]
828
820
829
- right = [diff .cumsum () - 1 , codes [- 1 ]]
821
+ right = [diff .cumsum () - 1 , codes [- 1 ]]
830
822
831
- _ , idx = get_join_indexers (left , right , sort = False , how = "left" )
832
- out = np .where (idx != - 1 , out [idx ], 0 )
823
+ _ , idx = get_join_indexers (left , right , sort = False , how = "left" )
824
+ out = np .where (idx != - 1 , out [idx ], 0 )
833
825
834
- if sort :
835
- sorter = np .lexsort ((out if ascending else - out , left [0 ]))
836
- out , left [- 1 ] = out [sorter ], left [- 1 ][sorter ]
826
+ if sort :
827
+ sorter = np .lexsort ((out if ascending else - out , left [0 ]))
828
+ out , left [- 1 ] = out [sorter ], left [- 1 ][sorter ]
837
829
838
- # build the multi-index w/ full levels
839
- def build_codes (lev_codes : np .ndarray ) -> np .ndarray :
840
- return np .repeat (lev_codes [diff ], nbin )
830
+ # build the multi-index w/ full levels
831
+ def build_codes (lev_codes : np .ndarray ) -> np .ndarray :
832
+ return np .repeat (lev_codes [diff ], nbin )
841
833
842
- codes = [build_codes (lev_codes ) for lev_codes in codes [:- 1 ]]
843
- codes .append (left [- 1 ])
834
+ codes = [build_codes (lev_codes ) for lev_codes in codes [:- 1 ]]
835
+ codes .append (left [- 1 ])
844
836
845
837
mi = MultiIndex (levels = levels , codes = codes , names = names , verify_integrity = False )
846
838
847
- if is_integer_dtype (out ):
839
+ if is_integer_dtype (out . dtype ):
848
840
out = ensure_int64 (out )
849
841
return self .obj ._constructor (out , index = mi , name = self ._selection_name )
850
842
0 commit comments