pandas.DataFrame.groupby#

DataFrame.groupby(by=None, level=None, *, as_index=True, sort=True, group_keys=True, observed=True, dropna=True)[源码]#

使用映射器或按列的 Series 对 DataFrame 进行分组。

groupby 操作涉及拆分对象、应用函数和组合结果的组合。这可用于对大量数据进行分组并对这些组执行计算。

参数:
by映射、函数、标签、pd.Grouper 或此类列表

用于确定 groupby 的分组。如果 by 是一个函数,它会在对象索引的每个值上调用。如果传递了 dict 或 Series,则将使用 Series 或 dict 的值来确定分组(Series 的值首先对齐;请参阅 .align() 方法)。如果传递了长度等于行数的列表或 ndarray(请参阅 groupby 用户指南),则将按原样使用这些值来确定分组。可以为 self 中的列传递标签或标签列表以进行分组。请注意,元组将被解释为(单个)键。

levelint、level 名称或此类序列,默认为 None

如果轴是 MultiIndex(分层),则按特定级别或级别分组。不要同时指定 bylevel

as_indexbool,默认为 True

返回以组标签作为索引的对象。仅与 DataFrame 输入相关。as_index=False 有效地产生“SQL 风格”的分组输出。此参数对过滤(请参阅用户指南中的过滤)没有影响,例如 head()tail()nth() 以及转换(请参阅用户指南中的转换)。

sortbool,默认为 True

对组键进行排序。通过关闭此项可以获得更好的性能。注意这不会影响每个组内的观察顺序。Groupby 保留每个组内的行顺序。如果为 False,则组将按其在原始 DataFrame 中出现的顺序显示。此参数对过滤(请参阅用户指南中的过滤)没有影响,例如 head()tail()nth() 以及转换(请参阅用户指南中的转换)。

已在版本 2.0.0 中更改:指定 sort=False 和有序分类分组器将不再对值进行排序。

group_keysbool,默认为 True

调用 apply 且 by 参数产生一个类似索引(即转换)的结果时,将组键添加到索引以标识各个部分。默认情况下,当结果的索引(和列)标签与输入匹配时,不会包含组键,否则会包含。

已在版本 2.0.0 中更改:group_keys 现在默认为 True

observedbool,默认为 True

这仅在任何分组器是Categoricals时适用。如果为True:仅显示分类分组器的已观察值。如果为False:显示分类分组器的所有值。

在版本 3.0.0 中更改:默认值现在是 `True`。

dropnabool,默认为 True

如果为 True,并且如果组键包含 NA 值,则 NA 值将与行/列一起被删除。如果为 False,则 NA 值也将被视为组中的键。

返回:
pandas.api.typing.DataFrameGroupBy

返回一个包含有关分组信息的 groupby 对象。

另请参阅

resample

时间序列的频率转换和重采样便捷方法。

注意

请参阅用户指南以获取更详细的用法和示例,包括拆分对象为组、迭代分组、选择分组、聚合等。

groupby 的实现是基于哈希的,这意味着将相等的对象将被视为同一组。一个例外是 pandas 对 NA 值的特殊处理:任何 NA 值将被折叠成一个组,无论它们如何比较。有关更多详细信息,请参阅上面链接的用户指南。

示例

>>> df = pd.DataFrame(
...     {
...         "Animal": ["Falcon", "Falcon", "Parrot", "Parrot"],
...         "Max Speed": [380.0, 370.0, 24.0, 26.0],
...     }
... )
>>> df
   Animal  Max Speed
0  Falcon      380.0
1  Falcon      370.0
2  Parrot       24.0
3  Parrot       26.0
>>> df.groupby(["Animal"]).mean()
        Max Speed
Animal
Falcon      375.0
Parrot       25.0

分层索引

我们可以使用 level 参数按分层索引的不同级别进行 groupby。

>>> arrays = [
...     ["Falcon", "Falcon", "Parrot", "Parrot"],
...     ["Captive", "Wild", "Captive", "Wild"],
... ]
>>> index = pd.MultiIndex.from_arrays(arrays, names=("Animal", "Type"))
>>> df = pd.DataFrame({"Max Speed": [390.0, 350.0, 30.0, 20.0]}, index=index)
>>> df
                Max Speed
Animal Type
Falcon Captive      390.0
       Wild         350.0
Parrot Captive       30.0
       Wild          20.0
>>> df.groupby(level=0).mean()
        Max Speed
Animal
Falcon      370.0
Parrot       25.0
>>> df.groupby(level="Type").mean()
         Max Speed
Type
Captive      210.0
Wild         185.0

我们还可以通过设置 dropna 参数来选择是否包含 NA 键,默认设置为 True

>>> arr = [[1, 2, 3], [1, None, 4], [2, 1, 3], [1, 2, 2]]
>>> df = pd.DataFrame(arr, columns=["a", "b", "c"])
>>> df.groupby(by=["b"]).sum()
    a   c
b
1.0 2   3
2.0 2   5
>>> df.groupby(by=["b"], dropna=False).sum()
    a   c
b
1.0 2   3
2.0 2   5
NaN 1   4
>>> arr = [["a", 12, 12], [None, 12.3, 33.0], ["b", 12.3, 123], ["a", 1, 1]]
>>> df = pd.DataFrame(arr, columns=["a", "b", "c"])
>>> df.groupby(by="a").sum()
    b     c
a
a   13.0   13.0
b   12.3  123.0
>>> df.groupby(by="a", dropna=False).sum()
    b     c
a
a   13.0   13.0
b   12.3  123.0
NaN 12.3   33.0

在使用 .apply() 时,使用 group_keys 来包含或排除组键。group_keys 参数默认为 True(包含)。

>>> df = pd.DataFrame(
...     {
...         "Animal": ["Falcon", "Falcon", "Parrot", "Parrot"],
...         "Max Speed": [380.0, 370.0, 24.0, 26.0],
...     }
... )
>>> df.groupby("Animal", group_keys=True)[["Max Speed"]].apply(lambda x: x)
          Max Speed
Animal
Falcon 0      380.0
       1      370.0
Parrot 2       24.0
       3       26.0
>>> df.groupby("Animal", group_keys=False)[["Max Speed"]].apply(lambda x: x)
   Max Speed
0      380.0
1      370.0
2       24.0
3       26.0