26
26
27
27
import numpy as np
28
28
29
- from pandas ._libs import (
30
- lib ,
31
- reduction as libreduction ,
32
- )
29
+ from pandas ._libs import reduction as libreduction
33
30
from pandas ._typing import (
34
31
ArrayLike ,
35
32
Manager ,
@@ -1734,7 +1731,7 @@ def value_counts(
1734
1731
observed = self .observed ,
1735
1732
dropna = self .dropna ,
1736
1733
)
1737
- result = gb .size ()
1734
+ result = cast ( Series , gb .size () )
1738
1735
1739
1736
if normalize :
1740
1737
# Normalize the results by dividing by the original group sizes.
@@ -1753,33 +1750,24 @@ def value_counts(
1753
1750
if sort :
1754
1751
# Sort the values and then resort by the main grouping
1755
1752
index_level = range (len (self .grouper .groupings ))
1756
- result = (
1757
- cast (Series , result )
1758
- .sort_values (ascending = ascending )
1759
- .sort_index (level = index_level , sort_remaining = False )
1753
+ result = result .sort_values (ascending = ascending ).sort_index (
1754
+ level = index_level , sort_remaining = False
1760
1755
)
1761
1756
1762
- if not self .as_index :
1757
+ if self .as_index :
1758
+ return result .__finalize__ (self .obj , method = "value_counts" )
1759
+ else :
1763
1760
# Convert to frame
1764
1761
name = "proportion" if normalize else "count"
1765
1762
columns = result .index .names
1766
1763
if name in columns :
1767
1764
raise ValueError (
1768
1765
f"Column label '{ name } ' is duplicate of result column"
1769
1766
)
1770
- columns = com .fill_missing_names (columns )
1771
- values = result .values
1772
- result_frame = DataFrame ()
1773
- for i , column in enumerate (columns ):
1774
- level_values = result .index .get_level_values (i )._values
1775
- if level_values .dtype == np .object_ :
1776
- level_values = lib .maybe_convert_objects (
1777
- cast (np .ndarray , level_values )
1778
- )
1779
- result_frame .insert (i , column , level_values , allow_duplicates = True )
1780
- result = result_frame .assign (** {name : values })
1781
-
1782
- return result .__finalize__ (self .obj , method = "value_counts" )
1767
+ result_frame = cast (
1768
+ DataFrame , result ._reset_index (name = name , allow_duplicates = True )
1769
+ )
1770
+ return result_frame .__finalize__ (self .obj , method = "value_counts" )
1783
1771
1784
1772
1785
1773
def _wrap_transform_general_frame (
0 commit comments