Skip to content

Commit 5247c92

Browse files
committed
Add doc string to GroupBy methods
1 parent d1a2042 commit 5247c92

File tree

3 files changed

+46
-37
lines changed

3 files changed

+46
-37
lines changed

pandas/core/groupby/generic.py

+12-34
Original file line numberDiff line numberDiff line change
@@ -79,28 +79,6 @@
7979
if TYPE_CHECKING:
8080
from pandas.core.internals import Block
8181

82-
_agg_template = """
83-
Compute {fname} of group values.
84-
85-
Parameters
86-
----------
87-
numeric_only : bool, default {no}
88-
Include only float, int, boolean columns. If None, will attempt to use
89-
everything, then use only numeric data.
90-
min_count : int, default {mc}
91-
The required number of valid values to perform the operation. If fewer
92-
than ``min_count`` non-NA values are present the result will be NA.
93-
94-
Returns
95-
-------
96-
{return_type}
97-
Computed {fname} of values within each group.
98-
99-
See Also
100-
--------
101-
{return_type}.groupby
102-
"""
103-
10482

10583
NamedAgg = namedtuple("NamedAgg", ["column", "aggfunc"])
10684
# TODO(typing) the return value on this callable should be any *scalar*.
@@ -811,27 +789,27 @@ def count(self) -> Series:
811789
)
812790
return self._reindex_output(result, fill_value=0)
813791

814-
@doc(_agg_template, fname="sum", no=True, mc=0, return_type="Series")
792+
@doc(GroupBy.sum.__doc__)
815793
def sum(self, numeric_only: bool = True, min_count: int = 0) -> Series:
816794
return super().sum(numeric_only=numeric_only, min_count=min_count)
817795

818-
@doc(_agg_template, fname="prod", no=True, mc=0, return_type="Series")
796+
@doc(GroupBy.prod.__doc__)
819797
def prod(self, numeric_only: bool = True, min_count: int = 0) -> Series:
820798
return super().prod(numeric_only=numeric_only, min_count=min_count)
821799

822-
@doc(_agg_template, fname="min", no=False, mc=-1, return_type="Series")
800+
@doc(GroupBy.min.__doc__)
823801
def min(self, numeric_only: bool = False, min_count: int = -1) -> Series:
824802
return super().min(numeric_only=numeric_only, min_count=min_count)
825803

826-
@doc(_agg_template, fname="max", no=False, mc=-1, return_type="Series")
804+
@doc(GroupBy.max.__doc__)
827805
def max(self, numeric_only: bool = False, min_count: int = -1) -> Series:
828806
return super().max(numeric_only=numeric_only, min_count=min_count)
829807

830-
@doc(_agg_template, fname="first", no=False, mc=-1, return_type="Series")
808+
@doc(GroupBy.first.__doc__)
831809
def first(self, numeric_only: bool = False, min_count: int = -1) -> Series:
832810
return super().first(numeric_only=numeric_only, min_count=min_count)
833811

834-
@doc(_agg_template, fname="last", no=False, mc=-1, return_type="Series")
812+
@doc(GroupBy.last.__doc__)
835813
def last(self, numeric_only: bool = False, min_count: int = -1) -> Series:
836814
return super().last(numeric_only=numeric_only, min_count=min_count)
837815

@@ -1909,27 +1887,27 @@ def groupby_series(obj, col=None):
19091887
results.index = ibase.default_index(len(results))
19101888
return results
19111889

1912-
@doc(_agg_template, fname="sum", no=True, mc=0, return_type="DataFrame")
1890+
@doc(GroupBy.sum.__doc__)
19131891
def sum(self, numeric_only: bool = True, min_count: int = 0) -> DataFrame:
19141892
return super().sum(numeric_only=numeric_only, min_count=min_count)
19151893

1916-
@doc(_agg_template, fname="prod", no=True, mc=0, return_type="DataFrame")
1894+
@doc(GroupBy.prod.__doc__)
19171895
def prod(self, numeric_only: bool = True, min_count: int = 0) -> DataFrame:
19181896
return super().prod(numeric_only=numeric_only, min_count=min_count)
19191897

1920-
@doc(_agg_template, fname="min", no=False, mc=-1, return_type="DataFrame")
1898+
@doc(GroupBy.min.__doc__)
19211899
def min(self, numeric_only: bool = False, min_count: int = -1) -> DataFrame:
19221900
return super().min(numeric_only=numeric_only, min_count=min_count)
19231901

1924-
@doc(_agg_template, fname="max", no=False, mc=-1, return_type="DataFrame")
1902+
@doc(GroupBy.max.__doc__)
19251903
def max(self, numeric_only: bool = False, min_count: int = -1) -> DataFrame:
19261904
return super().max(numeric_only=numeric_only, min_count=min_count)
19271905

1928-
@doc(_agg_template, fname="first", no=False, mc=-1, return_type="DataFrame")
1906+
@doc(GroupBy.first.__doc__)
19291907
def first(self, numeric_only: bool = False, min_count: int = -1) -> DataFrame:
19301908
return super().first(numeric_only=numeric_only, min_count=min_count)
19311909

1932-
@doc(_agg_template, fname="last", no=False, mc=-1, return_type="DataFrame")
1910+
@doc(GroupBy.last.__doc__)
19331911
def last(self, numeric_only: bool = False, min_count: int = -1) -> DataFrame:
19341912
return super().last(numeric_only=numeric_only, min_count=min_count)
19351913

pandas/core/groupby/groupby.py

+31-2
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,10 @@ class providing the base-class of operations.
3333

3434
from pandas._libs import Timestamp
3535
import pandas._libs.groupby as libgroupby
36-
from pandas._typing import FrameOrSeries, Scalar
36+
from pandas._typing import FrameOrSeries, FrameOrSeriesUnion, Scalar
3737
from pandas.compat.numpy import function as nv
3838
from pandas.errors import AbstractMethodError
39-
from pandas.util._decorators import Appender, Substitution, cache_readonly
39+
from pandas.util._decorators import Appender, Substitution, cache_readonly, doc
4040

4141
from pandas.core.dtypes.cast import maybe_downcast_to_dtype
4242
from pandas.core.dtypes.common import (
@@ -188,6 +188,29 @@ class providing the base-class of operations.
188188
""",
189189
)
190190

191+
_agg_template = """
192+
Compute {fname} of group values.
193+
194+
Parameters
195+
----------
196+
numeric_only : bool, default {no}
197+
Include only float, int, boolean columns. If None, will attempt to use
198+
everything, then use only numeric data.
199+
min_count : int, default {mc}
200+
The required number of valid values to perform the operation. If fewer
201+
than ``min_count`` non-NA values are present the result will be NA.
202+
203+
Returns
204+
-------
205+
Series or DataFrame
206+
Computed {fname} of values within each group.
207+
208+
See Also
209+
--------
210+
DataFrame.groupby
211+
Series.groupby
212+
"""
213+
191214
_pipe_template = """
192215
Apply a function `func` with arguments to this %(klass)s object and return
193216
the function's result.
@@ -1366,21 +1389,25 @@ def size(self):
13661389
result.name = self.obj.name
13671390
return self._reindex_output(result, fill_value=0)
13681391

1392+
@doc(_agg_template, fname="sum", no=True, mc=0)
13691393
def sum(self, numeric_only: bool = True, min_count: int = 0):
13701394
return self._agg_general(
13711395
numeric_only=numeric_only, min_count=min_count, alias="add", npfunc=np.sum
13721396
)
13731397

1398+
@doc(_agg_template, fname="prod", no=True, mc=0)
13741399
def prod(self, numeric_only: bool = True, min_count: int = 0):
13751400
return self._agg_general(
13761401
numeric_only=numeric_only, min_count=min_count, alias="prod", npfunc=np.prod
13771402
)
13781403

1404+
@doc(_agg_template, fname="min", no=False, mc=-1)
13791405
def min(self, numeric_only: bool = False, min_count: int = -1):
13801406
return self._agg_general(
13811407
numeric_only=numeric_only, min_count=min_count, alias="min", npfunc=np.min
13821408
)
13831409

1410+
@doc(_agg_template, fname="max", no=False, mc=-1)
13841411
def max(self, numeric_only: bool = False, min_count: int = -1):
13851412
return self._agg_general(
13861413
numeric_only=numeric_only, min_count=min_count, alias="max", npfunc=np.max
@@ -1403,6 +1430,7 @@ def get_loc_notna(x, loc: int):
14031430
else:
14041431
return get_loc_notna(x, loc=loc)
14051432

1433+
@doc(_agg_template, fname="first", no=False, mc=-1)
14061434
def first(self, numeric_only: bool = False, min_count: int = -1):
14071435
first_compat = partial(self._get_loc, loc=0)
14081436

@@ -1413,6 +1441,7 @@ def first(self, numeric_only: bool = False, min_count: int = -1):
14131441
npfunc=first_compat,
14141442
)
14151443

1444+
@doc(_agg_template, fname="last", no=False, mc=-1)
14161445
def last(self, numeric_only: bool = False, min_count: int = -1):
14171446
last_compat = partial(self._get_loc, loc=-1)
14181447

pandas/util/_decorators.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,7 @@ def wrapper(*args, **kwargs) -> Callable[..., Any]:
245245
return decorate
246246

247247

248-
def doc(*args: Union[str, Callable], **kwargs: Any) -> Callable[[F], F]:
248+
def doc(*args: Union[str, Callable, None], **kwargs: Any) -> Callable[[F], F]:
249249
"""
250250
A decorator take docstring templates, concatenate them and perform string
251251
substitution on it.
@@ -270,6 +270,8 @@ def wrapper(*args, **kwargs) -> Callable:
270270

271271
templates = [func.__doc__ if func.__doc__ else ""]
272272
for arg in args:
273+
if arg is None:
274+
continue
273275
if isinstance(arg, str):
274276
templates.append(arg)
275277
elif hasattr(arg, "_docstr_template"):

0 commit comments

Comments
 (0)