现在位置: 首页 > Pandas 教程 > 正文

Pandas groupby.sum() 函数

Pandas 常用函数 Pandas 常用函数


groupby.sum() 是 Pandas 中用于分组后求和的聚合函数。它通常与 groupby() 函数配合使用,先将数据按某个列的值进行分组,然后对每个分组中的数值列进行求和计算。

在实际数据分析中,sum() 是最常用的聚合函数之一。比如计算每个部门的总工资、每个地区的总销售额、每个类别的总数量等。


基本语法与参数

sum() 是 GroupBy 对象的成员函数,需要先使用 groupby() 分组后再调用。

语法格式

GroupBy.sum(numeric_only=False, min_count=-1, engine=None, engine_kwargs=None)

参数说明

参数 类型 说明 默认值
numeric_only bool 如果为 True,则只对数值列进行求和;如果为 False,会尝试对所有列求和。 False
min_count int 进行求和所需的有效值的最小数量。如果分组中的有效值少于该数量,则返回 NaN。 -1
engine str 指定计算引擎,可以是 'cython' 或 'numba'。None 表示由 Pandas 自动选择。 None
engine_kwargs dict 传递给底层引擎的额外参数字典。 None

返回值

  • 返回类型SeriesDataFrame
  • 说明:返回分组求和后的结果。如果对单列使用,返回 Series;如果对多列使用,返回 DataFrame。

实例

让我们通过一系列从简单到复杂的例子,彻底掌握 groupby.sum() 的用法。

示例 1:基础用法 - 按单列分组求和

最基本的用法是按照某一列的值进行分组,然后对另一列进行求和。

实例

import pandas as pd

# 创建销售数据 DataFrame
# 模拟一个包含地区、产品、销售额的表格
data = {
    '地区': ['华北', '华东', '华南', '华北', '华东', '华南', '华北', '华东'],
    '产品': ['A', 'B', 'C', 'B', 'A', 'C', 'A', 'B'],
    '销售额': [1000, 2000, 1500, 1800, 2200, 1600, 1200, 2100],
    '数量': [10, 20, 15, 18, 22, 16, 12, 21]
}

# 创建 DataFrame
df = pd.DataFrame(data)

print("原始销售数据:")
print(df)
print()

# 按"地区"分组,计算每个地区的总销售额
sales_by_region = df.groupby('地区')['销售额'].sum()

print("每个地区的总销售额:")
print(sales_by_region)
print()

# 按"产品"分组,计算每个产品的总销售数量
quantity_by_product = df.groupby('产品')['数量'].sum()

print("每个产品的总销售数量:")
print(quantity_by_product)

运行结果:

原始销售数据:
  地区  产品   销售额   数量
0  华北   A   1000    10
1  华东   B   2000    20
2  华南   C   1500    15
3  华北   B   1800    18
4  华东   A   2200    22
5  华南   C   1600    16
6  华北   A   1200    12
7  华东   B   2100    21

每个地区的总销售额:
地区
华东    7100
华南    3100
华北    4000
dtype: int64

每个产品的总销售数量:
产品
A    44
B    59
C    31
dtype: int64

代码解析:

  1. df.groupby('地区')['销售额'] 表示先按"地区"列分组,然后选取"销售额"列进行操作。
  2. .sum() 对每个分组中的销售额进行求和。
  3. 返回的结果是一个 Series,索引是分组列的值(即各地区名称)。

示例 2:多列分组求和

可以同时按多个列进行分组,然后对数值列求和。

实例

import pandas as pd

# 创建销售数据
data = {
    '地区': ['华北', '华东', '华南', '华北', '华东', '华南', '华北', '华东'],
    '产品': ['A', 'B', 'C', 'B', 'A', 'C', 'A', 'B'],
    '销售额': [1000, 2000, 1500, 1800, 2200, 1600, 1200, 2100],
    '数量': [10, 20, 15, 18, 22, 16, 12, 21]
}
df = pd.DataFrame(data)

print("原始销售数据:")
print(df)
print()

# 按"地区"和"产品"两列分组,计算总销售额和总数量
# as_index=False 表示分组列作为普通列保留在结果中
grouped = df.groupby(['地区', '产品'], as_index=False).sum()

print("按地区和产品分组后的总计:")
print(grouped)
print()

# 也可以不指定列,对所有数值列进行求和
grouped_all = df.groupby(['地区', '产品']).sum()
print("对所有数值列求和(返回DataFrame):")
print(grouped_all)

运行结果:

原始销售数据:
  地区  产品   销售额   数量
0  华北   A   1000    10
1  华东   B   2000    20
2  华南   C   1500    15
3  华北   B   1800    18
4  华东   A   2200    22
5  华南   C   1600    16
6  华北   A   1200    12
7  华东   B   2100    21

按地区和产品分组后的总计:
   地区  产品   销售额   数量
0  华东   A   2200    22
1  华东   B   4100    41
2  华南   C   3100    31
3  华北   A   2200    22
4  华北   B   1800    18

对所有数值列求和(返回DataFrame):
              销售额  数量
地区 产品
华东 A    2200   22
     B    4100   41
华南 C    3100   31
华北 A    2200   22
     B    1800   18

代码解析:

  • ['地区', '产品'] 使用列表可以同时按多列分组。
  • as_index=False 时,结果是 DataFrame 格式,分组列作为普通列保留。
  • 不指定列时(如.sum()),会对所有数值列进行求和。

示例 3:使用 min_count 参数

min_count 参数可以控制分组求和时需要的有效值最小数量。当分组中有效值少于该数量时,返回 NaN。

实例

import pandas as pd
import numpy as np

# 创建包含缺失值的数据
data = {
    '部门': ['A', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'C'],
    '工资': [5000, 6000, np.nan, 7000, np.nan, np.nan, 8000, 9000, 10000]
}
df = pd.DataFrame(data)

print("员工工资数据(包含缺失值):")
print(df)
print()

# 默认情况下,sum() 会忽略 NaN 值进行求和
sum_default = df.groupby('部门')['工资'].sum()
print("默认求和(忽略NaN):")
print(sum_default)
print()

# 设置 min_count=3,要求至少有3个有效值才进行求和
sum_min_count = df.groupby('部门')['工资'].sum(min_count=3)
print("min_count=3 时的求和结果:")
print(sum_min_count)
print()

# 设置 min_count=2
sum_min_count2 = df.groupby('部门')['工资'].sum(min_count=2)
print("min_count=2 时的求和结果:")
print(sum_min_count2)

运行结果:

员工工资数据(包含缺失值):
  部门     工资
0  A  5000.0
1  A  6000.0
2  A     NaN
3  B  7000.0
4  B     NaN
5  B     NaN
6  C  8000.0
7  C  9000.0
8  C  10000.0

默认求和(忽略NaN):
部门
A    11000.0
B     7000.0
C    27000.0
dtype: float64

min_count=3 时的求和结果:
部门
A    11000.0
B         NaN
C    27000.0
dtype: float64

min_count=2 时的求和结果:
部门
A    11000.0
B     7000.0
C    27000.0
dtype: float64

代码解析:

  • 默认情况下,sum() 会忽略 NaN 值,只对有效值进行求和。
  • min_count=3 表示每个分组至少有3个有效值才会计算求和,否则返回 NaN。
  • 部门A有2个有效值(5000和6000),不满足min_count=3,所以返回NaN;部门C有3个有效值,可以正常求和。

注意事项:sum() 默认会忽略 NaN 值进行求和,这与我们日常理解的"空值"处理一致。如果需要将 NaN 视为 0 再求和,可以先使用 fillna(0) 方法填充缺失值。


Pandas 常用函数 Pandas 常用函数