@@ -7820,42 +7820,30 @@ def _count_level(self, level, axis=0, numeric_only=False):
7820
7820
f"Can only count levels on hierarchical { self ._get_axis_name (axis )} ."
7821
7821
)
7822
7822
7823
- # Mask NaNs: Mask rows where the index level is NaN and all values in
7824
- # the DataFrame that are NaN
7825
- if frame ._is_mixed_type :
7826
- # Since we have mixed types, calling notna(frame.values) might
7827
- # upcast everything to object
7828
- mask = (
7829
- notna (frame .index .get_level_values (level = level )).reshape (- 1 , 1 ) &
7830
- notna (frame ).values
7831
- )
7832
- else :
7833
- # But use the speedup when we have homogeneous dtypes
7834
- mask = (
7835
- notna (frame .index .get_level_values (level = level )).reshape (- 1 , 1 ) &
7836
- notna (frame .values )
7837
- )
7823
+ # Mask NaNs: Mask rows or columns where the index level is NaN, and all
7824
+ # values in the DataFrame that are NaN
7825
+ values_mask = notna (frame .values )
7838
7826
7827
+ index_mask = notna (count_axis .get_level_values (level = level ))
7839
7828
if axis == 1 :
7840
- # We're transposing the mask rather than frame to avoid potential
7841
- # upcasts to object, which induces a ~20x slowdown
7842
- mask = mask . T
7829
+ mask = index_mask & values_mask
7830
+ else :
7831
+ mask = index_mask . reshape ( - 1 , 1 ) & values_mask
7843
7832
7844
7833
if isinstance (level , str ):
7845
7834
level = count_axis ._get_level_number (level )
7846
7835
7847
7836
level_name = count_axis ._names [level ]
7848
7837
level_index = count_axis .levels [level ]._shallow_copy (name = level_name )
7849
7838
level_codes = ensure_int64 (count_axis .codes [level ])
7850
- counts = lib .count_level_2d (mask , level_codes , len (level_index ), axis = 0 )
7851
-
7852
- result = DataFrame (counts , index = level_index , columns = agg_axis )
7839
+ counts = lib .count_level_2d (mask , level_codes , len (level_index ), axis = axis )
7853
7840
7854
7841
if axis == 1 :
7855
- # Undo our earlier transpose
7856
- return result .T
7842
+ result = DataFrame (counts , index = agg_axis , columns = level_index )
7857
7843
else :
7858
- return result
7844
+ result = DataFrame (counts , index = level_index , columns = agg_axis )
7845
+
7846
+ return result
7859
7847
7860
7848
def _reduce (
7861
7849
self , op , name , axis = 0 , skipna = True , numeric_only = None , filter_type = None , ** kwds
0 commit comments