Pandas groupby.sum() 函数
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 |
返回值
- 返回类型:
Series或DataFrame - 说明:返回分组求和后的结果。如果对单列使用,返回 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)
# 创建销售数据 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
代码解析:
df.groupby('地区')['销售额']表示先按"地区"列分组,然后选取"销售额"列进行操作。.sum()对每个分组中的销售额进行求和。- 返回的结果是一个 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)
# 创建销售数据
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)
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 常用函数