📜  python - 基于 2 个变量的 gropuby - Python (1)

📅  最后修改于: 2023-12-03 15:18:52.350000             🧑  作者: Mango

Python - 基于 2 个变量的 groupby

在 Python 中,groupby 函数可用于根据指定的变量对数据进行分组,以便进行聚合等操作。在本文中,我们将介绍如何使用 groupby 函数基于 2 个变量对数据进行分组。

前置知识

在学习本文之前,您应该了解以下知识:

  • Python 基础语法
  • Pandas 库的基础用法
  • groupby 函数的基础用法

如果您还不了解这些知识,请先学习相关的教程。

示例数据

在本文中,我们将使用以下示例数据:

import pandas as pd

data = {
    'fruit': ['apple', 'orange', 'banana', 'apple', 'apple', 'banana'],
    'color': ['red', 'orange', 'yellow', 'red', 'green', 'yellow'],
    'price': [1.0, 1.5, 0.5, 1.2, 1.3, 0.6]
}

df = pd.DataFrame(data)

这是一个包含 3 个字段的 DataFrame,其中 fruitcolor 是分组依据之一,price 是聚合的数值字段。

基于单个变量进行分组

在学习如何基于 2 个变量进行分组之前,我们先来回顾一下基于单个变量进行分组的方法。假设我们要根据 fruit 字段进行分组,可以这样写:

groups = df.groupby('fruit')

这样就得到了一个 groupby 对象。我们可以通过 groups.groups 属性来查看分组结果:

print(groups.groups)

输出结果为:

{'apple': [0, 3, 4], 'banana': [2, 5], 'orange': [1]}

可以看到,groups 对象中包含 3 个分组('apple', 'banana', 'orange'),每个分组对应的行号在 groups.groups 属性中以列表的形式存储。

基于两个变量进行分组

接下来,我们将介绍如何基于 2 个变量进行分组。假设我们要根据 fruitcolor 字段进行分组,可以这样写:

groups = df.groupby(['fruit', 'color'])

这个 groupby 对象中包含多个分组,每个分组由 ('fruit', 'color') 组成,对应的行号列表以字典的形式存储在 groups.groups 属性中:

print(groups.groups)

输出结果为:

{('apple', 'green'): [4], ('apple', 'red'): [0, 3], ('banana', 'yellow'): [2, 5], ('orange', 'orange'): [1]}

可以看到,groups 对象中包含 4 个分组,每个分组由 ('fruit', 'color') 组成,对应的行号列表以字典的形式存储在 groups.groups 属性中。

聚合操作

分组后,我们可以对每个分组执行聚合操作,例如求和、平均数等。在本文中,我们将使用 sum 函数对 price 字段进行求和操作。可以这样写:

result = groups['price'].sum()

这将返回一个新的 DataFrame,其中每行代表一个分组,包含 ('fruit', 'color') 和聚合后的 price 字段。

结果

下面是完整的示例代码和结果:

import pandas as pd

data = {
    'fruit': ['apple', 'orange', 'banana', 'apple', 'apple', 'banana'],
    'color': ['red', 'orange', 'yellow', 'red', 'green', 'yellow'],
    'price': [1.0, 1.5, 0.5, 1.2, 1.3, 0.6]
}

df = pd.DataFrame(data)

groups = df.groupby(['fruit', 'color'])
result = groups['price'].sum()

print(result)

输出结果为:

fruit   color 
apple   green     1.3
        red       2.2
banana  yellow    1.1
orange  orange    1.5
Name: price, dtype: float64

可以看到,对于每个分组,我们得到了 price 字段的总和。例如,组合 ('apple', 'green') 的价格总和为 1.3。