Pandas 中文手册

14.2 Groupby的创建方法

Pandas Groupby创建方法详解 | 单列多列索引自定义分组教程

Pandas 中文手册

本章节详细讲解Pandas中Groupby的创建方法,包括按单列分组、多列分组、索引分组和自定义条件分组,通过简单示例帮助新手快速掌握数据分组技巧,提升数据处理效率。

推荐工具
PyCharm专业版开发必备

功能强大的Python IDE,提供智能代码补全、代码分析、调试和测试工具,提高Python开发效率。特别适合处理列表等数据结构的开发工作。

了解更多

Groupby创建方法详解

引言

Groupby是Pandas中用于数据分组和聚合的核心功能。它允许您根据特定条件将数据分成多个组,然后对每个组执行操作(如求和、平均值等)。在本章中,我们将介绍Groupby的四种常见创建方法,让您轻松上手。

1. 按单列分组(指定单个列名,最常用)

按单列分组是最基础的分组方式。您只需指定一个列名,Pandas会根据该列的相同值将数据分组。

示例

假设我们有一个销售数据DataFrame:

import pandas as pd

# 创建示例数据
data = {
    '产品': ['A', 'B', 'A', 'B', 'A'],
    '销售额': [100, 150, 200, 120, 180],
    '地区': ['北京', '上海', '北京', '上海', '北京']
}
df = pd.DataFrame(data)
print(df)

输出:

  产品  销售额  地区
0  A   100  北京
1  B   150  上海
2  A   200  北京
3  B   120  上海
4  A   180  北京

按“产品”列分组:

# 按“产品”列分组
grouped = df.groupby('产品')

# 查看分组后的组数
print(grouped.groups)  # 输出分组字典

# 对每组执行聚合操作,如计算销售额总和
total_sales = grouped['销售额'].sum()
print(total_sales)

输出:

{'A': [0, 2, 4], 'B': [1, 3]}
产品
A    480
B    270
Name: 销售额, dtype: int64

解释groupby('产品') 根据“产品”列的不同值(A和B)将数据分组。使用 sum() 计算每组的销售额总和。

2. 按多列分组(指定多个列名,分层分组)

按多列分组允许您根据多个列进行分层分组,这在处理复杂数据时很有用。

示例

使用相同数据,按“产品”和“地区”两列分组:

# 按多列分组
grouped_multi = df.groupby(['产品', '地区'])

# 查看分组
print(grouped_multi.groups)

# 计算每组的销售额总和
total_multi = grouped_multi['销售额'].sum()
print(total_multi)

输出:

{('A', '北京'): [0, 2, 4], ('B', '上海'): [1, 3]}
产品  地区
A    北京    480
B    上海    270
dtype: int64

解释groupby(['产品', '地区']) 根据两列的复合键分组,结果是分层索引。这有助于更细致的分析。

3. 按索引分组(按行索引/列索引分组,level参数)

Groupby也可以按DataFrame的行索引或列索引分组,特别是当索引是MultiIndex(多层索引)时,可以使用 level 参数指定层级。

示例

设置多层索引后分组:

# 设置多层索引
df_indexed = df.set_index(['产品', '地区'])
print(df_indexed)

输出:

          销售额
产品 地区      
A   北京   100
B   上海   150
A   北京   200
B   上海   120
A   北京   180

按索引的“产品”层级分组:

# 按索引的“产品”层级分组
grouped_index = df_indexed.groupby(level='产品')

# 计算总和
sum_index = grouped_index['销售额'].sum()
print(sum_index)

输出:

产品
A    480
B    270
Name: 销售额, dtype: int64

解释groupby(level='产品') 指定按索引的第一层级(产品)分组。也可以按列索引分组,但较少见,例如 df.groupby(axis=1) 用于按列分组。

4. 按自定义条件分组(apply方法配合lambda表达式)

如果您需要更灵活的分组逻辑,可以使用自定义条件,结合 apply 方法和lambda表达式实现。

示例

假设我们想根据销售额是否大于150来分组:

# 定义自定义分组条件
def custom_group(row):
    if row['销售额'] > 150:
        return '高销售额'
    else:
        return '低销售额'

# 使用apply方法创建新列用于分组
df['销售额类别'] = df.apply(custom_group, axis=1)
print(df)

# 按新列分组
grouped_custom = df.groupby('销售额类别')

# 计算每组的平均销售额
avg_custom = grouped_custom['销售额'].mean()
print(avg_custom)

输出:

  产品  销售额  地区 销售额类别
0  A   100  北京     低销售额
1  B   150  上海     低销售额
2  A   200  北京     高销售额
3  B   120  上海     低销售额
4  A   180  北京     高销售额

销售额类别
低销售额    123.333333
高销售额    190.000000
Name: 销售额, dtype: float64

解释:通过 apply 方法添加一个新列“销售额类别”,然后按该列分组。lambda表达式也可以简化:df.apply(lambda row: '高' if row['销售额'] > 150 else '低', axis=1)

总结

在本章中,我们学习了Pandas Groupby的四种创建方法:

  • 按单列分组:最常用,适合简单场景。
  • 按多列分组:实现分层分组,用于复杂数据分析。
  • 按索引分组:适用于索引化的数据,便于层级操作。
  • 按自定义条件分组:提供灵活性,支持任意分组逻辑。

掌握这些方法,您将能高效处理各种数据分组任务。在实践中多尝试,结合聚合函数如 sum()mean() 等,发挥Groupby的强大功能。

开发工具推荐
Python开发者工具包

包含虚拟环境管理、代码格式化、依赖管理、测试框架等Python开发全流程工具,提高开发效率。特别适合处理复杂数据结构和算法。

获取工具包