Python group-by归约

  • Post category:Python

当我们需要对数据进行分类并执行某种聚合操作时,可以使用group-by方法。该方法可以将数据集按照指定的分类字段进行分组,然后依次对每个组执行指定的聚合函数。下面是Python中group-by使用的攻略。

使用方法

group-by方法属于pandas库中的DataFrameSeries对象的一种聚合操作,其语法如下:

DataFrame.groupby(by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True, squeeze=False, observed=False, **kwargs)

各参数的含义如下:

  • by: 用于分组的列名或列名的列表。
  • axis: 分组操作的方向,0表示行方向,1表示列方向。
  • level: 如果对象具有层次化索引,则按照指定的level分组。
  • as_index: 布尔型值,表示分组的键是否作为索引,True表示是,False表示否。
  • sort: 布尔型值,表示分组之后是否进行排序。
  • group_keys: 布尔型值,表示返回对象是否包含分组键。
  • squeeze: 布尔型值,表示分组操作结果是否以Series形式返回。
  • observed: 布尔型值,表示分组键中是否包含所有观测值。

常用的聚合函数有以下几种:

  • count(): 分组中非空数据的数量。
  • sum(): 分组中数据的和。
  • mean(): 分组中数据的平均数。
  • median(): 分组中数据的中位数。
  • min(): 分组中数据的最小值。
  • max(): 分组中数据的最大值。
  • std(): 分组中数据的标准差。
  • var(): 分组中数据的方差。

同时,我们还可以使用自定义函数来对分组后的数据进行聚合。

示例说明

下面给出两个具体的示例进行说明。

示例1

我们假设有一份购物订单数据,其中包含了买家姓名、购买产品类型、总价等字段。我们需要对数据进行分组,以产品类型为键,计算每种产品类型的订单数量与总金额。示例代码如下:

import pandas as pd

data = pd.DataFrame({
    'Name': ['Bob', 'John', 'Alice', 'Lisa', 'David', 'Tony', 'Michael', 'Emily'],
    'Product': ['Shoes', 'Clothes', 'Accessories', 'Shoes', 'Clothes', 'Accessories', 'Accessories', 'Shoes'],
    'Price': [800, 1200, 300, 650, 900, 500, 750, 750]
})

grouped = data.groupby('Product')
result = grouped.agg({
    'Name': 'count',
    'Price': 'sum'
})
print(result)

输出结果如下:

             Name  Price
Product                
Accessories     3   1550
Clothes         2   2100
Shoes           3   2200

示例2

我们再假设有一份学生成绩单,其中包含了学生姓名、所学科目、成绩等字段。我们需要对数据进行分组,以学生姓名为键,计算每个学生所有科目的平均成绩和总分数。示例代码如下:

import pandas as pd

data = pd.DataFrame({
    'Name': ['Bob', 'John', 'Alice', 'Lisa', 'David', 'Bob', 'Michael', 'Emily'],
    'Subject': ['Math', 'Math', 'Math', 'Math', 'Math', 'English', 'English', 'English'],
    'Score': [80, 75, 85, 90, 70, 85, 90, 80]
})

grouped = data.groupby('Name')
result = grouped.agg({
    'Score': ['mean', 'sum']
})
print(result)

输出结果如下:

        Score     
         mean  sum
Name             
Alice      85   85
Bob        82  164
David      70   70
Emily      80   80
John       75   75
Lisa       90   90
Michael    90   90

通过上述示例,我们可以看到group-by方法的实际应用方法。