pandas.DataFrame.groupby#

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

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

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

参数:
通过映射, 函数, 标签, pd.Grouper 或此类列表

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

级别int, 级别名称, 或此类序列, 默认 None

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

as_index布尔值, 默认 True

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

排序布尔值, 默认 True

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

在 2.0.0 版本发生变更: 使用有序分类分组器时指定 sort=False 将不再对值进行排序。

group_keys布尔值, 默认 True

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

在 1.5.0 版本发生变更: 警告 group_keysapply 的结果是类似索引的 Series 或 DataFrame 时将不再被忽略。明确指定 group_keys 以包含或不包含组键。

在 2.0.0 版本发生变更: group_keys 现在默认为 True

observed布尔值, 默认 True

这仅适用于分组器中的任何一个为分类时。如果为True:仅显示分类分组器的观察值。如果为False:显示分类分组器的所有值。

在 3.0.0 版本发生变更: 默认值现在是 True

dropna布尔值, 默认 True

如果为真,并且如果组键包含NA值,则将删除NA值以及行/列。如果为假,NA值也将被视为组中的键。

返回:
pandas.api.typing.DataFrameGroupBy

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

参见

resample

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

备注

更多详细用法和示例,请参阅 用户指南 ,包括将对象分组、遍历组、选择组、聚合等。

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

例子

>>> df = pd.DataFrame({'Animal': ['Falcon', 'Falcon',
...                               'Parrot', 'Parrot'],
...                    'Max Speed': [380., 370., 24., 26.]})
>>> 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 参数对分层索引的不同级别进行分组:

>>> arrays = [['Falcon', 'Falcon', 'Parrot', 'Parrot'],
...           ['Captive', 'Wild', 'Captive', 'Wild']]
>>> index = pd.MultiIndex.from_arrays(arrays, names=('Animal', 'Type'))
>>> df = pd.DataFrame({'Max Speed': [390., 350., 30., 20.]},
...                   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.], ["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., 370., 24., 26.]})
>>> 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