14.2 Groupby的创建方法
Pandas Groupby创建方法详解 | 单列多列索引自定义分组教程
本章节详细讲解Pandas中Groupby的创建方法,包括按单列分组、多列分组、索引分组和自定义条件分组,通过简单示例帮助新手快速掌握数据分组技巧,提升数据处理效率。
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的强大功能。